weaver-e10-builder 1.6.0 → 1.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +2 -0
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +109 -51
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/form-add-detail-table.js +3 -3
- package/dist/commands/form-add-detail-table.js.map +1 -1
- package/dist/commands/form-attachment-setting.d.ts +3 -0
- package/dist/commands/form-attachment-setting.d.ts.map +1 -0
- package/dist/commands/form-attachment-setting.js +422 -0
- package/dist/commands/form-attachment-setting.js.map +1 -0
- package/dist/commands/form-browser-definition.js +8 -8
- package/dist/commands/form-browser-definition.js.map +1 -1
- package/dist/commands/form-code.js +7 -7
- package/dist/commands/form-code.js.map +1 -1
- package/dist/commands/form-data.d.ts.map +1 -1
- package/dist/commands/form-data.js +50 -2
- package/dist/commands/form-data.js.map +1 -1
- package/dist/commands/form-ebuilder-scope.js +8 -8
- package/dist/commands/form-ebuilder-scope.js.map +1 -1
- package/dist/commands/form-engine-linkage.js +12 -12
- package/dist/commands/form-engine-linkage.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts +6 -1
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +138 -31
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form-layout-diff.js +1 -1
- package/dist/commands/form-layout-diff.js.map +1 -1
- package/dist/commands/form-layout-edit.js +1 -1
- package/dist/commands/form-layout-edit.js.map +1 -1
- package/dist/commands/form-layout-init-reviewed.js +1 -1
- package/dist/commands/form-layout-init-reviewed.js.map +1 -1
- package/dist/commands/form-layout-init.js +2 -2
- package/dist/commands/form-layout-init.js.map +1 -1
- package/dist/commands/form-layout-template-easy.js +1 -1
- package/dist/commands/form-layout-template-easy.js.map +1 -1
- package/dist/commands/form-layout.js +4 -4
- package/dist/commands/form-layout.js.map +1 -1
- package/dist/commands/form-view.d.ts.map +1 -1
- package/dist/commands/form-view.js +1 -2
- package/dist/commands/form-view.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +50 -5
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +39 -6
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/report-admin.js +1 -1
- package/dist/commands/report-admin.js.map +1 -1
- package/dist/commands/report-query.js +1 -1
- package/dist/commands/report-query.js.map +1 -1
- package/dist/commands/report.js +1 -1
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/wf-form-layout-init-reviewed.d.ts +3 -0
- package/dist/commands/wf-form-layout-init-reviewed.d.ts.map +1 -0
- package/dist/commands/wf-form-layout-init-reviewed.js +71 -0
- package/dist/commands/wf-form-layout-init-reviewed.js.map +1 -0
- package/dist/commands/wf-form.d.ts +1 -0
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +16 -16
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-advanced.js +1 -1
- package/dist/commands/workflow-advanced.js.map +1 -1
- package/dist/commands/workflow-basic-info.js +4 -4
- package/dist/commands/workflow-basic-info.js.map +1 -1
- package/dist/commands/workflow.js +6 -6
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/classified_protection_source.d.ts +10 -0
- package/dist/services/actionflow/classified_protection_source.d.ts.map +1 -0
- package/dist/services/actionflow/classified_protection_source.js +27 -0
- package/dist/services/actionflow/classified_protection_source.js.map +1 -0
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +4 -5
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +13 -1
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts +12 -0
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +88 -3
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_create.js +6 -10
- package/dist/services/actionflow/components/approve_create.js.map +1 -1
- package/dist/services/actionflow/components/condition.d.ts.map +1 -1
- package/dist/services/actionflow/components/condition.js +3 -2
- package/dist/services/actionflow/components/condition.js.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js +9 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
- package/dist/services/actionflow/components/send_message.js +1 -1
- package/dist/services/actionflow/components/send_message.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +20 -11
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +9 -1
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/design_client.d.ts +4 -0
- package/dist/services/actionflow/design_client.d.ts.map +1 -1
- package/dist/services/actionflow/design_client.js +65 -0
- package/dist/services/actionflow/design_client.js.map +1 -1
- package/dist/services/actionflow/form_source.d.ts +9 -2
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +21 -6
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +153 -37
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +14 -3
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +276 -42
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +154 -23
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/form-attachment-settings.d.ts +110 -0
- package/dist/services/form-attachment-settings.d.ts.map +1 -0
- package/dist/services/form-attachment-settings.js +332 -0
- package/dist/services/form-attachment-settings.js.map +1 -0
- package/dist/services/form-attachment-upload.d.ts +30 -0
- package/dist/services/form-attachment-upload.d.ts.map +1 -0
- package/dist/services/form-attachment-upload.js +76 -0
- package/dist/services/form-attachment-upload.js.map +1 -0
- package/dist/services/form-data-openapi.d.ts +2 -0
- package/dist/services/form-data-openapi.d.ts.map +1 -1
- package/dist/services/form-data-openapi.js +1 -0
- package/dist/services/form-data-openapi.js.map +1 -1
- package/dist/services/workflow-layout-init-reviewed.d.ts +35 -0
- package/dist/services/workflow-layout-init-reviewed.d.ts.map +1 -0
- package/dist/services/workflow-layout-init-reviewed.js +120 -0
- package/dist/services/workflow-layout-init-reviewed.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +163 -160
- package/skill-docs/_catalog.md +6 -4
- package/skill-docs/actionflows/SKILL.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +2 -0
- package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +1 -1
- package/skill-docs/actionflows/references/components/logic/Condition.md +2 -0
- package/skill-docs/actionflows/references/components/message/SendMessage.md +2 -2
- package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -17
- package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
- package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +1 -1
- package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -17
- package/skill-docs/assets/sample/api/formApi.js +689 -510
- package/skill-docs/assets/sample/app/config.js +4 -0
- package/skill-docs/assets/sample/app/fields.js +25 -0
- package/skill-docs/assets/sample/entry.js +24 -22
- package/skill-docs/assets/sample/eslint.config.cjs +1 -0
- package/skill-docs/assets/sample/pages/Items.js +247 -0
- package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
- package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
- package/skill-docs/references/coding/guide-form-crud.md +195 -172
- package/skill-docs/references/coding/guide-html-to-react.md +250 -0
- package/skill-docs/references/coding/guide-page-code.md +194 -167
- package/skill-docs/references/coding/guide-page-export.md +27 -18
- package/skill-docs/references/coding/ref-compile-rules.md +7 -7
- package/skill-docs/references/common/map.md +2 -1
- package/skill-docs/references/common/ref-cli-commands.md +14 -6
- package/skill-docs/references/components/display-FilePreview.md +5 -4
- package/skill-docs/references/form/guide-browser-definition.md +73 -40
- package/skill-docs/references/form/guide-field-linkage.md +4 -1
- package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
- package/skill-docs/references/form/guide-form-data.md +22 -1
- package/skill-docs/references/form/layout/code-block/layout-css.md +41 -0
- package/skill-docs/references/form/layout/initialization.md +2 -0
- package/skill-docs/references/form/layout/layout-overview.md +8 -0
- package/skill-docs/references/form/layout/template/advanced.md +21 -0
- package/skill-docs/references/form/layout/template/easy.md +2 -0
- package/skill-docs/references/form/layout/template/flow.md +2 -0
- package/skill-docs/references/form/layout/template/template-guide.md +3 -1
- package/skill-docs/references/form/layout/workflow-layout.md +13 -1
- package/skill-docs/references/form/ref-form-fields.md +18 -4
- package/skill-docs/references/workflow/guide-workflow-odoc.md +1 -1
- package/skill-docs/assets/sample/config/config.js +0 -0
- package/skill-docs/assets/sample/config/configLoad.js +0 -0
- package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
- package/skill-docs/assets/sample/config/config_default.js +0 -0
- package/skill-docs/assets/sample/memo.md +0 -0
- package/skill-docs/assets/sample/readme.js +0 -8
|
@@ -1,29 +1,37 @@
|
|
|
1
1
|
# 页面编码指南
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> 本文件是 Ecode React 页面的主入口。用户明确要求 Ecode、还原 HTML 原型或不要设计器时,直接按本指南执行,不要再建议改用设计器。
|
|
4
|
+
> 页面是搭建的最后一步,写代码前确保应用、表单、流程已建好。
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## 一、项目结构
|
|
9
9
|
|
|
10
10
|
```
|
|
11
|
-
├── entry.js
|
|
12
|
-
├── pages/
|
|
11
|
+
├── entry.js ← 路由注册入口
|
|
12
|
+
├── pages/ ← 页面组件
|
|
13
|
+
│ └── Items.js
|
|
13
14
|
├── api/
|
|
14
|
-
│ └── formApi.js
|
|
15
|
-
|
|
15
|
+
│ └── formApi.js ← formClient
|
|
16
|
+
├── app/
|
|
17
|
+
│ ├── config.js ← APP_ID / OBJ_ID
|
|
18
|
+
│ └── fields.js ← 字段 ID 常量
|
|
19
|
+
├── styles/
|
|
20
|
+
│ └── prototypeStyles.js ← 原型的 CSS 字符串
|
|
21
|
+
└── resources/ ← 图片等静态资源
|
|
16
22
|
```
|
|
17
23
|
|
|
18
|
-
- entry.js
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
24
|
+
- `entry.js` 只做入口注册,不写业务逻辑。
|
|
25
|
+
- 只能在泛微云运行,其他环境缺少 `@weapp/*` 依赖。
|
|
26
|
+
- 只支持 JS,不支持 JSX 文件扩展名或 TS;JSX 写在 `.js` 里由 Babel 编译。
|
|
27
|
+
- 所有页面代码全 ESM(`import` / `export`),不要 `module.exports`。
|
|
28
|
+
- **应用配置不要放 `config/`**:平台把 `config/` 当内置配置目录,普通模块导入拿不到(实测 `OBJ_ID` 为 undefined)。放 `app/`、`lib/` 这类普通目录。
|
|
29
|
+
|
|
30
|
+
参考完整样例:`assets/sample/`。
|
|
23
31
|
|
|
24
32
|
---
|
|
25
33
|
|
|
26
|
-
## entry.js
|
|
34
|
+
## 二、entry.js:`${appId}` 是固定字符串
|
|
27
35
|
|
|
28
36
|
```js
|
|
29
37
|
import React from 'react';
|
|
@@ -31,20 +39,17 @@ import { Route } from 'react-router-dom';
|
|
|
31
39
|
import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
|
|
32
40
|
import { asyncImport } from '@weapp/ecodesdk';
|
|
33
41
|
|
|
34
|
-
var
|
|
42
|
+
var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
|
|
35
43
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return asyncImport('${appId}', 'pages/
|
|
44
|
+
var ItemsPage = React.lazy(function () {
|
|
45
|
+
// 单引号里的 ${appId} 是固定字符串,不是应用 ID,不要替换成数字
|
|
46
|
+
return asyncImport('${appId}', 'pages/Items');
|
|
39
47
|
});
|
|
40
48
|
|
|
41
|
-
// 2. 路由 path 写死字符串,
|
|
42
|
-
var ROUTE_PATH = '/sp/custom/ecode/my-page';
|
|
43
|
-
|
|
44
49
|
var extract = (
|
|
45
|
-
<Route path={publicUrl +
|
|
50
|
+
<Route path={publicUrl + '/sp/custom/ecode/items'}>
|
|
46
51
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
47
|
-
<
|
|
52
|
+
<ItemsPage />
|
|
48
53
|
</React.Suspense>
|
|
49
54
|
</Route>
|
|
50
55
|
);
|
|
@@ -55,192 +60,214 @@ regOvProps('weappEcodesdk', 'Switch', function (props) {
|
|
|
55
60
|
}, 0);
|
|
56
61
|
```
|
|
57
62
|
|
|
58
|
-
|
|
59
|
-
- `asyncImport('${appId}', 'pages/xxx')` — 第一个参数**固定**是 `'${appId}'`,不能写空字符串、不能写别的值
|
|
60
|
-
- `React.Suspense` **只包裹一层**,不要双层嵌套
|
|
61
|
-
- 路由 path 写死字符串(如 `/sp/custom/ecode/my-page`),**不拼接 `${appId}` 变量**
|
|
62
|
-
|
|
63
|
-
**一个项目可以包含多个页面**,在 entry.js 中按同样模式注册:
|
|
63
|
+
**`asyncImport` 的第一个参数是字面量 `'${appId}'`**:
|
|
64
64
|
|
|
65
65
|
```js
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
});
|
|
66
|
+
// 正确:原样保留这个字符串
|
|
67
|
+
asyncImport('${appId}', 'pages/Items')
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var extract = (
|
|
75
|
-
<>
|
|
76
|
-
<Route path={publicUrl + '/sp/custom/ecode/meeting-list'}>
|
|
77
|
-
<React.Suspense fallback={<div>Loading...</div>}>
|
|
78
|
-
<MeetingList />
|
|
79
|
-
</React.Suspense>
|
|
80
|
-
</Route>
|
|
81
|
-
<Route path={publicUrl + '/sp/custom/ecode/meeting-form'}>
|
|
82
|
-
<React.Suspense fallback={<div>Loading...</div>}>
|
|
83
|
-
<MeetingForm />
|
|
84
|
-
</React.Suspense>
|
|
85
|
-
</Route>
|
|
86
|
-
</>
|
|
87
|
-
);
|
|
69
|
+
// 错误:把 Ebuilder 应用 ID、Ecode 项目 ID 或任何数字填进去
|
|
70
|
+
asyncImport('1330584721118584834', 'pages/Items')
|
|
71
|
+
asyncImport('1328370888652840961', 'pages/Items')
|
|
88
72
|
```
|
|
89
73
|
|
|
90
|
-
|
|
74
|
+
它不是变量,也不是当前应用的 `APP_ID`;平台在运行时会替换这个固定占位符。几个名字不要混:
|
|
91
75
|
|
|
92
|
-
|
|
76
|
+
| 名称 | 是什么 | 用在哪 |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| `${appId}` | 固定占位字符串 | `asyncImport` 第一个参数,原样保留 |
|
|
79
|
+
| `APP_ID` | 当前 Ebuilder 应用 ID | `formClient({ appId: APP_ID })`、数据接口请求头 |
|
|
80
|
+
| `ecodeAppId` | Ecode 应用文件夹 ID | `ecodInfo.json`,与 Ebuilder 应用 ID 不同 |
|
|
81
|
+
| `mainUrl` | 页面主路由 | `ecodInfo.json`,必须和 `entry.js` 的 route path 一致 |
|
|
93
82
|
|
|
94
|
-
|
|
83
|
+
其它铁律:
|
|
95
84
|
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
- entry.js
|
|
85
|
+
- `React.Suspense` 只包一层。
|
|
86
|
+
- 路由 path 写死字符串(如 `/sp/custom/ecode/items`),不要拼 `${appId}` 变量。
|
|
87
|
+
- entry.js 里只能使用 `React`、`ReactDOM`、`react-router-dom`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`;不要使用 `@weapp/ui` 组件。
|
|
88
|
+
- 一个项目可以有多个页面,每个页面按同样方式 `React.lazy` + `asyncImport` 注册。
|
|
99
89
|
|
|
100
90
|
---
|
|
101
91
|
|
|
102
|
-
##
|
|
92
|
+
## 三、字段常量
|
|
103
93
|
|
|
104
|
-
|
|
94
|
+
先用 CLI 导出字段:
|
|
105
95
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
| Pagination | `import { Pagination } from '@weapp/ui'` | `references/components/display-Pagination.md` |
|
|
112
|
-
| Icon | `import { Icon } from '@weapp/ui'` | `references/components/display-Icon.md` |
|
|
113
|
-
| Button | `import { Button } from '@weapp/ui'` | `references/components/@weapp-Button.md` |
|
|
114
|
-
| EChart | `import { EChart } from '@weapp/ui'` | `references/components/generic-Echarts.md` |
|
|
115
|
-
| CorsComponent | `import { CorsComponent } from '@weapp/ui'` | `references/components/display-FilePreview.md` |
|
|
116
|
-
| Browser(人员) | `import { Browser } from '@weapp/ui'`<br>`type="resource"` | `references/components/form-EmployeeBrowser-api.md` |
|
|
117
|
-
| Browser(部门) | `import { Browser } from '@weapp/ui'`<br>`type="department"` | `references/components/form-DepartmentBrowser-api.md` |
|
|
118
|
-
| Upload | `import { Upload } from '@weapp/ui'` | `references/components/form-Upload.md` |
|
|
119
|
-
| Badge | `import { Badge } from '@weapp/ui'` | `references/components/base-Badge.md` |
|
|
120
|
-
| Tag | `import { Tag } from '@weapp/ui'` | `references/components/base-Tag.md` |
|
|
96
|
+
```bash
|
|
97
|
+
e10-cli form read <objId> --app-id <appId> --out fields.json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
再生成 `app/fields.js`:
|
|
121
101
|
|
|
122
|
-
表单输入控件(文本框、下拉框、日期选择等)用原生 HTML:
|
|
123
102
|
```js
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
103
|
+
export var F = {
|
|
104
|
+
name: '4765111450482898127',
|
|
105
|
+
status: '4765111450482898155',
|
|
106
|
+
owner: '4765111450482898160'
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export var LABELS = {
|
|
110
|
+
name: '名称',
|
|
111
|
+
status: '状态',
|
|
112
|
+
owner: '负责人'
|
|
113
|
+
};
|
|
131
114
|
```
|
|
132
115
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
## 表单数据操作(核心模式)
|
|
116
|
+
字段 ID 必须是 `fields.json` 里的 `fieldId`,不要手写、不要用字段名代替。
|
|
136
117
|
|
|
137
|
-
|
|
118
|
+
---
|
|
138
119
|
|
|
139
|
-
|
|
140
|
-
|-----|------|---------|
|
|
141
|
-
| `getSimpleData(objId, userId)` | 读 ID、写回 formToSave | 所有特殊字段统一返回 `fieldOptionId`(纯数字串) |
|
|
142
|
-
| `getAllData(objId, userId)` | 提取名称、编辑回显 | 含 `fieldOptionName`,mainTable key 是随机哈希 |
|
|
143
|
-
| `withDisplayNames(rows, map)` | 表格展示:ID → 名称 | 把 Select 的 `valueKey` 映射为中文名 |
|
|
144
|
-
| `getFieldOptions(fieldId, objId)` | 拿下拉选项 | `[{valueKey, name}]` |
|
|
120
|
+
## 四、表单数据:只用 formClient
|
|
145
121
|
|
|
146
|
-
|
|
122
|
+
```js
|
|
123
|
+
import { formClient } from '../api/formApi.js';
|
|
124
|
+
import { APP_ID, OBJ_ID } from '../app/config.js';
|
|
147
125
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
| Text / Number / Date | `"值"` / `123` / `"2026-01-01"` | 直接展示 |
|
|
151
|
-
| Select / RadioBox / CheckBox | `"1283421826353889337"`(选项 ID) | `getFieldOptions` → `withDisplayNames` 映射 |
|
|
152
|
-
| **Employee** | `"2765550234448235905"`(用户 ID) | `getAllData` 的 `fieldOptionName`,**不是** getFieldOptions |
|
|
153
|
-
| **Department** | `"2765550234448235905"`(部门 ID) | 同上 |
|
|
154
|
-
| FileComponent | `"fileid1,fileid2"`(文件 ID 串) | 上传组件的 `name` |
|
|
126
|
+
var items = formClient({ objId: OBJ_ID, appId: APP_ID });
|
|
127
|
+
```
|
|
155
128
|
|
|
156
|
-
|
|
129
|
+
页面只记三件事:
|
|
157
130
|
|
|
158
131
|
```js
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
useEffect(function () {
|
|
162
|
-
Promise.all([
|
|
163
|
-
getSimpleData(OBJ_ID, USER_ID),
|
|
164
|
-
getFieldOptions(F.status, OBJ_ID), // Select 字段拿选项
|
|
165
|
-
]).then(function ([rows, statusOpts]) {
|
|
166
|
-
// 加载时为每个需要展示名称的 Select/Employee 字段做映射
|
|
167
|
-
// Employee/Department 的名称要另外从 getAllData 提取!
|
|
168
|
-
var displayRows = withDisplayNames(rows, {
|
|
169
|
-
[F.status]: statusOpts,
|
|
170
|
-
});
|
|
171
|
-
// Employee 字段需要额外用 getAllData 构建 ID→名称 map
|
|
172
|
-
setData(displayRows);
|
|
173
|
-
});
|
|
174
|
-
}, []);
|
|
132
|
+
page.rows[i].values / display / items // 一个行形状
|
|
133
|
+
items.list / get / save / update / remove // 一套 CRUD
|
|
175
134
|
```
|
|
176
135
|
|
|
177
|
-
|
|
136
|
+
完整用法见 `guide-form-crud.md`,编辑回显见 `guide-edit-backfill.md`。最小列表页:
|
|
178
137
|
|
|
179
138
|
```js
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
|
|
139
|
+
import React, { useEffect, useState } from 'react';
|
|
140
|
+
import { formClient } from '../api/formApi.js';
|
|
141
|
+
import { APP_ID, OBJ_ID } from '../app/config.js';
|
|
142
|
+
import { F, LABELS } from '../app/fields.js';
|
|
143
|
+
|
|
144
|
+
var items = formClient({ objId: OBJ_ID, appId: APP_ID });
|
|
145
|
+
|
|
146
|
+
export default function Items() {
|
|
147
|
+
var [rows, setRows] = useState([]);
|
|
148
|
+
var [error, setError] = useState('');
|
|
149
|
+
|
|
150
|
+
useEffect(function () {
|
|
151
|
+
items.list({ page: 1, size: 20 }).then(function (page) {
|
|
152
|
+
setRows(page.rows);
|
|
153
|
+
}).catch(function (err) {
|
|
154
|
+
setError(err.message);
|
|
155
|
+
});
|
|
156
|
+
}, []);
|
|
157
|
+
|
|
158
|
+
return (
|
|
159
|
+
<div>
|
|
160
|
+
{error ? <div>{error}</div> : null}
|
|
161
|
+
<table>
|
|
162
|
+
<thead>
|
|
163
|
+
<tr><th>{LABELS.name}</th><th>{LABELS.status}</th></tr>
|
|
164
|
+
</thead>
|
|
165
|
+
<tbody>
|
|
166
|
+
{rows.map(function (row) {
|
|
167
|
+
return (
|
|
168
|
+
<tr key={row.id}>
|
|
169
|
+
<td>{row.display[F.name]}</td>
|
|
170
|
+
<td>{row.display[F.status]}</td>
|
|
171
|
+
</tr>
|
|
172
|
+
);
|
|
173
|
+
})}
|
|
174
|
+
</tbody>
|
|
175
|
+
</table>
|
|
176
|
+
</div>
|
|
177
|
+
);
|
|
194
178
|
}
|
|
195
179
|
```
|
|
196
180
|
|
|
197
|
-
|
|
181
|
+
不要再在页面里:
|
|
182
|
+
|
|
183
|
+
- 传 `userId` / `tenantKey`
|
|
184
|
+
- 调 `getSimpleData` / `getAllData` / `withDisplayNames`
|
|
185
|
+
- 拼 `mainTable`、判断随机 key、数组还是对象
|
|
186
|
+
- 把 `display` 里的中文名写回接口
|
|
187
|
+
|
|
188
|
+
这些都在 `formApi.js` 里处理。
|
|
198
189
|
|
|
199
190
|
---
|
|
200
191
|
|
|
201
|
-
##
|
|
192
|
+
## 五、HTML 原型还原
|
|
193
|
+
|
|
194
|
+
用户提供 HTML / 设计稿并要求还原时,读 `guide-html-to-react.md`。核心规则:
|
|
202
195
|
|
|
203
|
-
- `
|
|
204
|
-
-
|
|
205
|
-
-
|
|
206
|
-
-
|
|
196
|
+
- 原型 `<style>` 整段复制到 `styles/prototypeStyles.js` 的字符串里,页面用 `<style>{PROTOTYPE_CSS}</style>` 渲染一次
|
|
197
|
+
- 不新写 CSS、不建独立 `.css`、不 `import` CSS、不把规则逐条改写成内联 style
|
|
198
|
+
- 保留原 class 名和 DOM 层级,只做 `class`→`className`、`for`→`htmlFor`、`style` 字符串→对象、模板字符串→组件/`map` 的机械转换
|
|
199
|
+
- 全局选择器、`:root`、keyframes 收敛到页面根容器,避免污染平台壳
|
|
200
|
+
- 图片走 `${appRes}/...`
|
|
207
201
|
|
|
208
202
|
---
|
|
209
203
|
|
|
210
|
-
##
|
|
204
|
+
## 六、@weapp/ui 可用组件
|
|
205
|
+
|
|
206
|
+
**只能使用下列组件**,不要从 `@weapp/ui` 里编造组件名:
|
|
207
|
+
|
|
208
|
+
| 组件 | import 方式 | 文档 |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| Table | `import { Table } from '@weapp/ui'` | `references/components/display-Table.md` |
|
|
211
|
+
| Avatar | `import { Avatar } from '@weapp/ui'` | `references/components/display-Avatar.md` |
|
|
212
|
+
| List | `import { List } from '@weapp/ui'` | `references/components/display-List.md` |
|
|
213
|
+
| Pagination | `import { Pagination } from '@weapp/ui'` | `references/components/display-Pagination.md` |
|
|
214
|
+
| Icon | `import { Icon } from '@weapp/ui'` | `references/components/display-Icon.md` |
|
|
215
|
+
| Button | `import { Button } from '@weapp/ui'` | `references/components/@weapp-Button.md` |
|
|
216
|
+
| EChart | `import { EChart } from '@weapp/ui'` | `references/components/generic-Echarts.md` |
|
|
217
|
+
| CorsComponent | `import { CorsComponent } from '@weapp/ui'` | `references/components/display-FilePreview.md` |
|
|
218
|
+
| Browser(人员) | `import { Browser } from '@weapp/ui'`,`type="resource"` | `references/components/form-EmployeeBrowser-api.md` |
|
|
219
|
+
| Browser(部门) | `import { Browser } from '@weapp/ui'`,`type="department"` | `references/components/form-DepartmentBrowser-api.md` |
|
|
220
|
+
| Upload | `import { Upload } from '@weapp/ui'` | `references/components/form-Upload.md` |
|
|
221
|
+
| Badge | `import { Badge } from '@weapp/ui'` | `references/components/base-Badge.md` |
|
|
222
|
+
| Tag | `import { Tag } from '@weapp/ui'` | `references/components/base-Tag.md` |
|
|
223
|
+
|
|
224
|
+
文本框、数字、日期、下拉框用原生 HTML,不要为了用组件而用组件。原型还原优先用原生 HTML + 原型 CSS,平台组件只用于人员/部门选择、上传、文件预览等必须能力。
|
|
225
|
+
|
|
226
|
+
---
|
|
211
227
|
|
|
212
|
-
|
|
213
|
-
> 违反不会报编译错,只会让页面发布后白屏、样式丢失或资源 404,且本地很难发现,写完务必逐条对照。
|
|
228
|
+
## 七、平台硬规则
|
|
214
229
|
|
|
215
230
|
| 规则 | 说明 |
|
|
216
|
-
|
|
217
|
-
|
|
|
218
|
-
|
|
|
219
|
-
|
|
|
220
|
-
|
|
|
221
|
-
|
|
|
222
|
-
|
|
|
223
|
-
|
|
224
|
-
|
|
231
|
+
|---|---|
|
|
232
|
+
| 资源统一 `${appRes}/相对路径` | 禁止 `./resources/...`、`../resources/...`、`/resources/...`;发布后会 404 |
|
|
233
|
+
| 禁止在线资源 | 不要 CDN、`loadjs('http(s)://...')`;第三方库先下载进项目 |
|
|
234
|
+
| 禁止 `import './x.css'` | ecode 无 CSS 模块解析;样式用原型 CSS 字符串或内联 style |
|
|
235
|
+
| 全 ESM | 不要 `module.exports` |
|
|
236
|
+
| 只用白名单组件 | 不编造组件/props,不读 `props.children[...]`、不依赖内部 class/`weId` |
|
|
237
|
+
| 路由 path 写死 | 不拼 `${appId}` 变量 |
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 八、自检与交付
|
|
242
|
+
|
|
243
|
+
1. 用 `e10-cli check <项目目录>` 扫描已知规则。
|
|
244
|
+
2. 用 `ecodecmd build <项目目录> --target=e10` 做真实编译;**不要依赖 `e10-cli compile` 作为门禁**。
|
|
245
|
+
3. 检查 `build.json`:`entry.js` 必须是 `state:"y"`;新增文件后再次 build 不会自动补登记。
|
|
246
|
+
4. 部署后由用户在实际环境验收页面;本流程不提供本地预览。
|
|
247
|
+
|
|
248
|
+
自检清单:
|
|
249
|
+
|
|
250
|
+
- [ ] `asyncImport('${appId}', ...)` 是固定字符串,没有换成数字
|
|
251
|
+
- [ ] 所有变量用 `var`,没有 `let/const`(import 除外)
|
|
252
|
+
- [ ] 没有 `??`、无参 `catch {}`、动态 `import()`
|
|
253
|
+
- [ ] 页面在模块顶层创建 `formClient`,没有放进 render
|
|
254
|
+
- [ ] 列表只渲染 `display`,写入只用 `values`
|
|
255
|
+
- [ ] 人员/部门/附件回显用 `items`
|
|
256
|
+
- [ ] 没有 `import` CSS,样式来自原型 CSS 字符串
|
|
257
|
+
- [ ] 图片/资源使用 `${appRes}/...`
|
|
258
|
+
- [ ] 只用白名单组件,没有直接改平台组件内部
|
|
259
|
+
- [ ] `entry.js` 只做路由注册,没有业务逻辑
|
|
225
260
|
|
|
226
261
|
---
|
|
227
262
|
|
|
228
|
-
##
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
8. [ ] 没有 `forEach/map/filter(fn, this)` 传 context 的写法,用 `var self = this;` 替代
|
|
240
|
-
9. [ ] 表单数据 key 用字段 ID(纯数字字符串),对照 `form read --out fields.json`
|
|
241
|
-
10. [ ] Employee/Department 字段写入前已转为 ID
|
|
242
|
-
11. [ ] 页面没有 JS `import` CSS、没有 `module.exports`(全 ESM)
|
|
243
|
-
12. [ ] 图片等静态资源统一 `${appRes}/相对路径`,没有写死相对路径或在线热链(loadjs/CDN)
|
|
244
|
-
13. [ ] 只用清单内的 `@weapp/ui` 组件,不读 `props.children[...]`、不依赖内部 class/weId
|
|
245
|
-
14. [ ] entry.js 只做路由注册,没有业务逻辑 / 轮询 / 直接 import 页面组件
|
|
246
|
-
15. [ ] 写完代码后运行 `e10-cli check <项目目录>` 逐条自检
|
|
263
|
+
## 九、常见错误
|
|
264
|
+
|
|
265
|
+
| 错误 | 正确做法 |
|
|
266
|
+
|---|---|
|
|
267
|
+
| 把 `asyncImport` 第一个参数换成应用 ID 数字 | 原样保留 `'${appId}'` |
|
|
268
|
+
| 在 `pages/` 里直接 `import` 另一个页面 | 用 `React.lazy(function () { return asyncImport('${appId}', 'pages/xxx'); })` |
|
|
269
|
+
| 用 `row.display` 回填表单 | 用 `row.values` |
|
|
270
|
+
| 用中文选项名做 `===` 比较 | 用选项 ID / `valueKey` |
|
|
271
|
+
| 列表没传 `page/size` | 默认可能只回 10 条,显式传 |
|
|
272
|
+
| 样式拆成独立 `.css` | 放回原型 CSS 字符串 |
|
|
273
|
+
| 把 `const appId = '${appId}'` 当变量用 | 不需要这个变量,直接写在 `asyncImport` 里 |
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
只有前置加载的文件才可以直接 import:
|
|
8
8
|
|
|
9
9
|
```js
|
|
10
|
-
import {
|
|
10
|
+
import { formClient } from './api/formApi.js'; // 路径示例;实际在 pages 里使用
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
- entry.js 中只能使用 `React`、`ReactDOM`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`
|
|
13
|
+
- entry.js 中只能使用 `React`、`ReactDOM`、`react-router-dom`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`
|
|
14
14
|
- **不能使用 `@weapp/ui` 组件**
|
|
15
|
-
- entry
|
|
15
|
+
- entry 只完成入口的注册,不要写入业务逻辑;数据操作放在 `pages/` 里
|
|
16
16
|
|
|
17
17
|
### 非前置加载文件(pages/ 目录)
|
|
18
18
|
|
|
@@ -20,10 +20,14 @@ import { getSimpleData } from './api/formApi.js'; // entry.js 中可以直接
|
|
|
20
20
|
|
|
21
21
|
```js
|
|
22
22
|
import { asyncImport } from '@weapp/ecodesdk';
|
|
23
|
-
|
|
24
|
-
//
|
|
23
|
+
var AgentSxxx = React.lazy(function () {
|
|
24
|
+
// 单引号里的 ${appId} 是固定字符串,不是应用 ID,不要替换成数字
|
|
25
|
+
return asyncImport('${appId}', 'pages/AgentSxxx');
|
|
26
|
+
});
|
|
25
27
|
```
|
|
26
28
|
|
|
29
|
+
> `asyncImport` 第一个参数必须原样保留 `'${appId}'`。它不是 Ebuilder 应用 ID、不是 Ecode 项目 ID,也不是任何数字;平台运行时会替换这个固定占位符。`app/config.js` 里的 `APP_ID` 是 Ebuilder 应用 ID,只用于数据接口请求头。
|
|
30
|
+
|
|
27
31
|
引用路径要根据文件相对位置判断:
|
|
28
32
|
- entry.js 中引用 `api/formApi.js`:`'./api/formApi.js'`
|
|
29
33
|
- pages/ 目录下引用 `api/formApi.js`:`'../api/formApi.js'`
|
|
@@ -35,16 +39,20 @@ const AgentSxxx = React.lazy(() => asyncImport('${appId}', 'pages/AgentSxxx'));
|
|
|
35
39
|
在 `entry.js` 中通过 `regOvProps` + `regReactChildren` 注册路由:
|
|
36
40
|
|
|
37
41
|
```js
|
|
42
|
+
import React from 'react';
|
|
43
|
+
import { Route } from 'react-router-dom';
|
|
38
44
|
import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
|
|
46
|
+
var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
|
|
47
|
+
var extract = (
|
|
48
|
+
<Route path={publicUrl + '/sp/custom/ecode/my-page'}>
|
|
42
49
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
43
|
-
<Test />
|
|
50
|
+
<Test />
|
|
44
51
|
</React.Suspense>
|
|
45
52
|
</Route>
|
|
46
53
|
);
|
|
47
|
-
|
|
54
|
+
|
|
55
|
+
regOvProps('weappEcodesdk', 'Switch', function (props) {
|
|
48
56
|
regReactChildren(props, extract);
|
|
49
57
|
return props;
|
|
50
58
|
}, 0);
|
|
@@ -90,26 +98,27 @@ regOvProps('weappEcodesdk', 'Switch', (props) => {
|
|
|
90
98
|
|
|
91
99
|
```js
|
|
92
100
|
import React from 'react';
|
|
101
|
+
import { Route } from 'react-router-dom';
|
|
93
102
|
import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
|
|
94
103
|
import { asyncImport } from '@weapp/ecodesdk';
|
|
95
104
|
|
|
96
|
-
|
|
97
|
-
const appId = '${appId}';
|
|
105
|
+
var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
|
|
98
106
|
|
|
99
|
-
|
|
100
|
-
|
|
107
|
+
var MyPage = React.lazy(function () {
|
|
108
|
+
// 单引号里的 ${appId} 是固定字符串,不是应用 ID
|
|
109
|
+
return asyncImport('${appId}', 'pages/MyPage');
|
|
110
|
+
});
|
|
101
111
|
|
|
102
|
-
// 注册路由 — path 写死固定字符串,和
|
|
103
112
|
var ROUTE_PATH = '/sp/custom/ecode/my-page';
|
|
104
|
-
|
|
105
|
-
<Route path={
|
|
113
|
+
var myRoute = (
|
|
114
|
+
<Route path={publicUrl + ROUTE_PATH}>
|
|
106
115
|
<React.Suspense fallback={<div>Loading...</div>}>
|
|
107
116
|
<MyPage />
|
|
108
117
|
</React.Suspense>
|
|
109
118
|
</Route>
|
|
110
119
|
);
|
|
111
120
|
|
|
112
|
-
regOvProps('weappEcodesdk', 'Switch', (props)
|
|
121
|
+
regOvProps('weappEcodesdk', 'Switch', function (props) {
|
|
113
122
|
regReactChildren(props, myRoute);
|
|
114
123
|
return props;
|
|
115
124
|
}, 0);
|
|
@@ -29,7 +29,7 @@ plugins: ['proposal-object-rest-spread', 'proposal-optional-chaining']
|
|
|
29
29
|
|------|------|
|
|
30
30
|
| JSX | `<div className="app">{content}</div>` |
|
|
31
31
|
| 箭头函数 | `(x) => x + 1` |
|
|
32
|
-
| async/await | `
|
|
32
|
+
| async/await | `var page = await items.list({ page: 1, size: 20 })` |
|
|
33
33
|
| 模板字符串 | `` `Hello ${name}` `` |
|
|
34
34
|
| 对象展开 `...` | `{ ...oldObj, newKey: val }` |
|
|
35
35
|
| 可选链 `?.` | `obj?.nested?.value` |
|
|
@@ -113,9 +113,9 @@ e10-cli project import <projectId> .target/xxx.zip --main-url /sp/custom/...
|
|
|
113
113
|
|
|
114
114
|
- **禁止在 JS 里 `import` CSS**:ecode 无 CSS 模块解析,写了必丢、发布后无样式。
|
|
115
115
|
- **用户提供 HTML 原型时,页面样式严格 100% 还原**(布局、间距、字号、颜色、圆角、边框、层级),不用平台默认样式近似代替。
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
- 业务 CSS 选择器挂在页面根容器下,避免裸 `.类名`、`body`、`:root` 或平台内部 class
|
|
116
|
+
- **复用原型 CSS**:把原型 `<style>` 整段复制到代码里的字符串(如 `styles/prototypeStyles.js`),页面用 `<style>{PROTOTYPE_CSS}</style>` 渲染一次。不要新写 CSS、不要拆独立 `.css` 文件、不要把规则逐条改写成内联 style。
|
|
117
|
+
- 少量页面样式可以用内联 style;确需独立 `.css` 文件时,确认它在 `build.json` 的 codes 里(首次自动生成时 `.css` 会登记为 `y`;文件是后加的要自行补登记),否则平台不合并加载。
|
|
118
|
+
- 业务 CSS 选择器挂在页面根容器下,避免裸 `.类名`、`body`、`:root` 或平台内部 class 污染全局;原型的全局选择器和 keyframes 要收敛到页面根并加前缀。
|
|
119
119
|
|
|
120
120
|
### 资源规则
|
|
121
121
|
|
|
@@ -126,7 +126,7 @@ e10-cli project import <projectId> .target/xxx.zip --main-url /sp/custom/...
|
|
|
126
126
|
|
|
127
127
|
## 关键注意事项
|
|
128
128
|
|
|
129
|
-
1. **所有变量用 var 声明**,非前置加载文件引用确保使用 `React.lazy(()
|
|
130
|
-
2.
|
|
131
|
-
3. 写完代码后运行 `e10-cli check <项目目录>`
|
|
129
|
+
1. **所有变量用 var 声明**,非前置加载文件引用确保使用 `React.lazy(function () { return asyncImport('${appId}', 'pages/xxx'); })`
|
|
130
|
+
2. **`${appId}` 是固定占位字符串**,不是 Ebuilder 应用 ID、Ecode 项目 ID 或任何数字;原样写在 `asyncImport` 第一个参数里,运行时由 ecode SDK 替换
|
|
131
|
+
3. 写完代码后运行 `e10-cli check <项目目录>` 扫描已知规则,再用 `ecodecmd build <项目目录> --target=e10` 做真实编译;**不要把 `e10-cli compile` 当作可靠门禁**
|
|
132
132
|
4. 本地修改后一定要及时 `ecodecmd build` + `import` 上传,否则用户无法验证(用户看不到本地代码)
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
- **Ebuilder 应用** — 独立概念,包含表单、流程等资源(与 Ecode 项目不同)。
|
|
16
16
|
- **默认台账与菜单入口是两件事** — 表单创建后会生成默认台账/列表视图,但 `form create` 默认不加应用菜单;需要入口时用 `--menu`,或建表后 `menu add-table`。默认台账已存在不等于菜单入口已存在。
|
|
17
17
|
- 只有图表仪表盘、跨表单聚合视图、特殊交互流程、对外公开页面等场景才需要自定义页面。
|
|
18
|
+
- 用户明确要求 Ecode、还原 HTML 原型或说明不要设计器时,按定制页面规划,直接走 Ecode;不要建议改用设计器。
|
|
18
19
|
- 所有系统交互命令均通过 `e10-cli` 执行(已全局 link)。auth 文件自动查找,也可 `--auth <path>` 指定。
|
|
19
20
|
- 当前登录用户的 userId 是固定变量 `TEAMS.currentUser.id`,前端代码里可以直接使用。
|
|
20
21
|
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
| 报表 | 统计、分组和报表布局 | 写单元格、查询、共享和交付效果 | 保存与实际展示分别核对 | [报表创建](../report/guide-report-build.md) |
|
|
41
42
|
| 菜单 | 提供台账、流程或页面入口 | 目标资源先存在;写层级、名称与可见主体 | 验收点击目标与菜单权限 | [菜单](../menu/system-menus.md) |
|
|
42
43
|
| 配置式页面 | 用设计器组件搭建页面 | 写数据源、组件、布局和 PC/MOBILE 要求 | 验收两端布局与数据绑定 | [设计器](../ebuilder-designer/guide-designer.md) |
|
|
43
|
-
| 定制页面 | 实现标准配置之外的交互 |
|
|
44
|
+
| 定制页面 | 实现标准配置之外的交互 | 写目标页面、作用范围、发布与入口;HTML 原型还原写清样式复用方式 | 验收实际加载和业务交互 | [页面编码](../coding/guide-page-code.md)、[HTML 原型还原](../coding/guide-html-to-react.md) |
|
|
44
45
|
| ESB 系统接口 | 从接口文档创建对外接口定义 | 写系统池、接口清单和文档来源 | 区分接口定义与动作流 HTTP 调用;验收创建结果 | [接口导入](../esb-interface/guide-import.md) |
|
|
45
46
|
| 组织数据 | 维护部门、人员等基础数据 | 写机构归属、人员来源和导入范围 | 批量导入先预检;验收数据和归属 | [组织](../hrm/guide-org-employee.md) |
|
|
46
47
|
|