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.
Files changed (183) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +2 -0
  3. package/dist/commands/actionflow.js.map +1 -1
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +109 -51
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/form-add-detail-table.js +3 -3
  8. package/dist/commands/form-add-detail-table.js.map +1 -1
  9. package/dist/commands/form-attachment-setting.d.ts +3 -0
  10. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  11. package/dist/commands/form-attachment-setting.js +422 -0
  12. package/dist/commands/form-attachment-setting.js.map +1 -0
  13. package/dist/commands/form-browser-definition.js +8 -8
  14. package/dist/commands/form-browser-definition.js.map +1 -1
  15. package/dist/commands/form-code.js +7 -7
  16. package/dist/commands/form-code.js.map +1 -1
  17. package/dist/commands/form-data.d.ts.map +1 -1
  18. package/dist/commands/form-data.js +50 -2
  19. package/dist/commands/form-data.js.map +1 -1
  20. package/dist/commands/form-ebuilder-scope.js +8 -8
  21. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  22. package/dist/commands/form-engine-linkage.js +12 -12
  23. package/dist/commands/form-engine-linkage.js.map +1 -1
  24. package/dist/commands/form-field-linkage.d.ts +6 -1
  25. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  26. package/dist/commands/form-field-linkage.js +138 -31
  27. package/dist/commands/form-field-linkage.js.map +1 -1
  28. package/dist/commands/form-layout-diff.js +1 -1
  29. package/dist/commands/form-layout-diff.js.map +1 -1
  30. package/dist/commands/form-layout-edit.js +1 -1
  31. package/dist/commands/form-layout-edit.js.map +1 -1
  32. package/dist/commands/form-layout-init-reviewed.js +1 -1
  33. package/dist/commands/form-layout-init-reviewed.js.map +1 -1
  34. package/dist/commands/form-layout-init.js +2 -2
  35. package/dist/commands/form-layout-init.js.map +1 -1
  36. package/dist/commands/form-layout-template-easy.js +1 -1
  37. package/dist/commands/form-layout-template-easy.js.map +1 -1
  38. package/dist/commands/form-layout.js +4 -4
  39. package/dist/commands/form-layout.js.map +1 -1
  40. package/dist/commands/form-view.d.ts.map +1 -1
  41. package/dist/commands/form-view.js +1 -2
  42. package/dist/commands/form-view.js.map +1 -1
  43. package/dist/commands/form.d.ts.map +1 -1
  44. package/dist/commands/form.js +50 -5
  45. package/dist/commands/form.js.map +1 -1
  46. package/dist/commands/project.d.ts.map +1 -1
  47. package/dist/commands/project.js +39 -6
  48. package/dist/commands/project.js.map +1 -1
  49. package/dist/commands/report-admin.js +1 -1
  50. package/dist/commands/report-admin.js.map +1 -1
  51. package/dist/commands/report-query.js +1 -1
  52. package/dist/commands/report-query.js.map +1 -1
  53. package/dist/commands/report.js +1 -1
  54. package/dist/commands/report.js.map +1 -1
  55. package/dist/commands/wf-form-layout-init-reviewed.d.ts +3 -0
  56. package/dist/commands/wf-form-layout-init-reviewed.d.ts.map +1 -0
  57. package/dist/commands/wf-form-layout-init-reviewed.js +71 -0
  58. package/dist/commands/wf-form-layout-init-reviewed.js.map +1 -0
  59. package/dist/commands/wf-form.d.ts +1 -0
  60. package/dist/commands/wf-form.d.ts.map +1 -1
  61. package/dist/commands/wf-form.js +16 -16
  62. package/dist/commands/wf-form.js.map +1 -1
  63. package/dist/commands/workflow-advanced.js +1 -1
  64. package/dist/commands/workflow-advanced.js.map +1 -1
  65. package/dist/commands/workflow-basic-info.js +4 -4
  66. package/dist/commands/workflow-basic-info.js.map +1 -1
  67. package/dist/commands/workflow.js +6 -6
  68. package/dist/commands/workflow.js.map +1 -1
  69. package/dist/index.js +22 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/services/actionflow/classified_protection_source.d.ts +10 -0
  72. package/dist/services/actionflow/classified_protection_source.d.ts.map +1 -0
  73. package/dist/services/actionflow/classified_protection_source.js +27 -0
  74. package/dist/services/actionflow/classified_protection_source.js.map +1 -0
  75. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  76. package/dist/services/actionflow/components/action_eb_add.js +4 -5
  77. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  78. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  79. package/dist/services/actionflow/components/action_eb_update.js +13 -1
  80. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  81. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts +12 -0
  82. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/action_eb_update_compiler.js +88 -3
  84. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  85. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  86. package/dist/services/actionflow/components/approve_create.js +6 -10
  87. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  88. package/dist/services/actionflow/components/condition.d.ts.map +1 -1
  89. package/dist/services/actionflow/components/condition.js +3 -2
  90. package/dist/services/actionflow/components/condition.js.map +1 -1
  91. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  92. package/dist/services/actionflow/components/eb_get_data_by_id.js +9 -1
  93. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  94. package/dist/services/actionflow/components/send_message.js +1 -1
  95. package/dist/services/actionflow/components/send_message.js.map +1 -1
  96. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  97. package/dist/services/actionflow/components/workflow_actions.js +20 -11
  98. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  99. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  100. package/dist/services/actionflow/context_preflight.js +9 -1
  101. package/dist/services/actionflow/context_preflight.js.map +1 -1
  102. package/dist/services/actionflow/design_client.d.ts +4 -0
  103. package/dist/services/actionflow/design_client.d.ts.map +1 -1
  104. package/dist/services/actionflow/design_client.js +65 -0
  105. package/dist/services/actionflow/design_client.js.map +1 -1
  106. package/dist/services/actionflow/form_source.d.ts +9 -2
  107. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  108. package/dist/services/actionflow/form_source.js +21 -6
  109. package/dist/services/actionflow/form_source.js.map +1 -1
  110. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  111. package/dist/services/actionflow/formula_service.js +153 -37
  112. package/dist/services/actionflow/formula_service.js.map +1 -1
  113. package/dist/services/actionflow/preflight_service.d.ts +14 -3
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +276 -42
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  118. package/dist/services/actionflow/workflow_compiler.js +154 -23
  119. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  120. package/dist/services/form-attachment-settings.d.ts +110 -0
  121. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  122. package/dist/services/form-attachment-settings.js +332 -0
  123. package/dist/services/form-attachment-settings.js.map +1 -0
  124. package/dist/services/form-attachment-upload.d.ts +30 -0
  125. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  126. package/dist/services/form-attachment-upload.js +76 -0
  127. package/dist/services/form-attachment-upload.js.map +1 -0
  128. package/dist/services/form-data-openapi.d.ts +2 -0
  129. package/dist/services/form-data-openapi.d.ts.map +1 -1
  130. package/dist/services/form-data-openapi.js +1 -0
  131. package/dist/services/form-data-openapi.js.map +1 -1
  132. package/dist/services/workflow-layout-init-reviewed.d.ts +35 -0
  133. package/dist/services/workflow-layout-init-reviewed.d.ts.map +1 -0
  134. package/dist/services/workflow-layout-init-reviewed.js +120 -0
  135. package/dist/services/workflow-layout-init-reviewed.js.map +1 -0
  136. package/package.json +1 -1
  137. package/skill-docs/SKILL.md +163 -160
  138. package/skill-docs/_catalog.md +6 -4
  139. package/skill-docs/actionflows/SKILL.md +2 -0
  140. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +2 -0
  141. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +1 -1
  142. package/skill-docs/actionflows/references/components/logic/Condition.md +2 -0
  143. package/skill-docs/actionflows/references/components/message/SendMessage.md +2 -2
  144. package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -17
  145. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  146. package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +1 -1
  147. package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -17
  148. package/skill-docs/assets/sample/api/formApi.js +689 -510
  149. package/skill-docs/assets/sample/app/config.js +4 -0
  150. package/skill-docs/assets/sample/app/fields.js +25 -0
  151. package/skill-docs/assets/sample/entry.js +24 -22
  152. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  153. package/skill-docs/assets/sample/pages/Items.js +247 -0
  154. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  155. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  156. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  157. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  158. package/skill-docs/references/coding/guide-page-code.md +194 -167
  159. package/skill-docs/references/coding/guide-page-export.md +27 -18
  160. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  161. package/skill-docs/references/common/map.md +2 -1
  162. package/skill-docs/references/common/ref-cli-commands.md +14 -6
  163. package/skill-docs/references/components/display-FilePreview.md +5 -4
  164. package/skill-docs/references/form/guide-browser-definition.md +73 -40
  165. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  166. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  167. package/skill-docs/references/form/guide-form-data.md +22 -1
  168. package/skill-docs/references/form/layout/code-block/layout-css.md +41 -0
  169. package/skill-docs/references/form/layout/initialization.md +2 -0
  170. package/skill-docs/references/form/layout/layout-overview.md +8 -0
  171. package/skill-docs/references/form/layout/template/advanced.md +21 -0
  172. package/skill-docs/references/form/layout/template/easy.md +2 -0
  173. package/skill-docs/references/form/layout/template/flow.md +2 -0
  174. package/skill-docs/references/form/layout/template/template-guide.md +3 -1
  175. package/skill-docs/references/form/layout/workflow-layout.md +13 -1
  176. package/skill-docs/references/form/ref-form-fields.md +18 -4
  177. package/skill-docs/references/workflow/guide-workflow-odoc.md +1 -1
  178. package/skill-docs/assets/sample/config/config.js +0 -0
  179. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  180. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  181. package/skill-docs/assets/sample/config/config_default.js +0 -0
  182. package/skill-docs/assets/sample/memo.md +0 -0
  183. package/skill-docs/assets/sample/readme.js +0 -8
@@ -1,29 +1,37 @@
1
1
  # 页面编码指南
2
2
 
3
- > 本文件为 SKILL.md 的子模块,在需要写页面代码时加载。
4
- > 页面是搭建流程的最后一步,写代码前确保应用、表单、流程都已建好。
3
+ > 本文件是 Ecode React 页面的主入口。用户明确要求 Ecode、还原 HTML 原型或不要设计器时,直接按本指南执行,不要再建议改用设计器。
4
+ > 页面是搭建的最后一步,写代码前确保应用、表单、流程已建好。
5
5
 
6
6
  ---
7
7
 
8
- ## 项目结构(从sample拷贝过来)
8
+ ## 一、项目结构
9
9
 
10
10
  ```
11
- ├── entry.js ← 路由注册入口
12
- ├── pages/ ← 页面组件
11
+ ├── entry.js ← 路由注册入口
12
+ ├── pages/ ← 页面组件
13
+ │ └── Items.js
13
14
  ├── api/
14
- │ └── formApi.js ← 表单数据 API
15
- └── config/ ← 配置文件(不用管)
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
- - formApi.js 默认自带。
20
- - 该项目只能在泛微云运行,其他环境缺少依赖都会报错。
21
- - 只能支持 js 编码,**不支持 jsx 或 ts**。
22
- - 尽量使用原生 React 编码。
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 { publicUrl } = appInfo('@weapp/ecodesdk');
42
+ var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
35
43
 
36
- // 1. 异步引入页面组件 — asyncImport 第一个参数固定为 '${appId}',不允许留空
37
- var MyPage = React.lazy(function () {
38
- return asyncImport('${appId}', 'pages/MyPage');
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 + ROUTE_PATH}>
50
+ <Route path={publicUrl + '/sp/custom/ecode/items'}>
46
51
  <React.Suspense fallback={<div>Loading...</div>}>
47
- <MyPage />
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
- var MeetingList = React.lazy(function () {
67
- return asyncImport('${appId}', 'pages/MeetingList');
68
- });
66
+ // 正确:原样保留这个字符串
67
+ asyncImport('${appId}', 'pages/Items')
69
68
 
70
- var MeetingForm = React.lazy(function () {
71
- return asyncImport('${appId}', 'pages/MeetingForm');
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
- > 新页面导出和路由注册详见 `references/coding/guide-page-export.md`
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
- - **前置加载文件(entry.js)**可以直接 import:`import { getSimpleData } from './api/formApi.js'`
97
- - **非前置加载文件(pages/ 下的所有文件)**只能通过 `React.lazy(() => asyncImport('${appId}', 'pages/xxx'))` 引用
98
- - entry.js 中只能使用 `React`、`ReactDOM`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`,**不能使用 `@weapp/ui` 组件**
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
- ## @weapp/ui 可用组件清单
92
+ ## 三、字段常量
103
93
 
104
- **只能使用以下明确列出的组件**,不要从 `@weapp/ui` 里编造任何不在此列表中的组件名。
94
+ 先用 CLI 导出字段:
105
95
 
106
- | 组件 | import 方式 | 参考文档 |
107
- |------|-----------|---------|
108
- | Table | `import { Table } from '@weapp/ui'` | `references/components/display-Table.md` |
109
- | Avatar | `import { Avatar } from '@weapp/ui'` | `references/components/display-Avatar.md` |
110
- | List | `import { List } from '@weapp/ui'` | `references/components/display-List.md` |
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
- <input type="text" value={form[F.name]} onChange={...} />
125
- <input type="date" value={form[F.date]} onChange={...} />
126
- <select value={form[F.status]} onChange={...}>
127
- {options.map(function (opt) {
128
- return <option key={opt.valueKey} value={opt.valueKey}>{opt.name}</option>;
129
- })}
130
- </select>
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
- **四个 API 各有分工,不要混用:**
118
+ ---
138
119
 
139
- | API | 用途 | 返回内容 |
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
- | 字段类型 | getSimpleData 返回 | 展示时名称来源 |
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
- var [data, setData] = useState([]);
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
- // form 中所有值已经是 ID,直接拼入 formToSave
181
- var formToSave = {};
182
- Object.keys(form).forEach(function (key) {
183
- if (form[key] !== '' && form[key] !== null && form[key] !== undefined) {
184
- formToSave[key] = form[key];
185
- }
186
- });
187
- // 选择器新值覆盖
188
- if (selectedPerson.length > 0) formToSave[F.person] = selectedPerson[0].id;
189
-
190
- if (editingId) {
191
- updateFormData(OBJ_ID, formToSave, editingId, USER_ID);
192
- } else {
193
- saveFormData(OBJ_ID, formToSave, USER_ID);
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
- > 完整的数据读写指南见 `references/coding/guide-form-crud.md`,编辑回显见 `references/coding/guide-edit-backfill.md`(前端代码)。
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
- - `ecodecmd build {project-dir} --target=e10` 打包(cd 到项目前一级)
204
- - 所有变量用 `var` 声明
205
- - 不支持的语法:`catch{}` 无参数 catch、`??`、`import()` 动态导入、`BigInt`
206
- - 详见 `references/coding/ref-compile-rules.md`(编译配置)、`references/coding/guide-page-export.md`(引用规范)
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
- ## E10 平台硬规则(白屏 / 无样式 / 资源 404 的真凶)
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
- | **资源统一用 `${appRes}/相对路径`**(如 `${appRes}/logo.png`) | `${appRes}` 是平台模板变量,导入后自动替换成正式静态地址。**禁止**写 `./resources/...`、`../resources/...`、`/resources/...`,发布后必 404。 |
218
- | **禁止在线资源** | 不要 `loadjs('http(s)://...')`、CDN、外链脚本——平台不加载外网资源。确需第三方脚本:先下载进项目,再按上一条 `${appRes}` 引用。 |
219
- | **禁止在 JS 里 `import` CSS** | ecode 没有 CSS 模块解析,`import './x.css'` 不会生效,样式静默丢失。少量样式用内联 style;独立 CSS 文件的打包规则见 `ref-compile-rules.md`「E10 打包与平台加载规则」。 |
220
- | **HTML 原型:样式严格 100% 还原** | 用户提供 HTML 原型时,页面样式必须与原型严格一致(布局、间距、字号、颜色、圆角、边框、层级),不得用平台默认样式近似代替;交付前逐项对照原型自检。 |
221
- | **HTML 复刻:样式写进代码,不建独立 CSS 文件** | 用户提供 HTML/设计稿并要求完整复刻时,样式全部写在组件代码里(内联 `style` / 代码内样式对象),**不要生成独立 `.css` 文件**——拆出去不保证被加载,复刻会静默丢样式。 |
222
- | **全部用 ESM `import` / `export`,禁止 `module.exports`** | 平台按模块加载,CommonJS 导出解析不到。 |
223
- | **只用白名单组件及其文档化 props** | 拿不准的组件 / prop / 图标名,先查 `references/components/`,不要凭记忆从 `@weapp/ui` 编造。 |
224
- | **不碰平台组件内部** | 不读 `props.children[...]`(含可选链写法)、不依赖内部 class / `weId` 段、不做全局无条件 `regOvComponent` 复写——内部结构不是稳定 API,平台升级即坏。 |
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
- 1. [ ] 变量用 `var` 声明,非 `const`/`let`
233
- 2. [ ] 非前置加载文件引用使用 `React.lazy(() => asyncImport(...))`
234
- 3. [ ] **表格中没有任何裸 ID 展示**:Employee/Department 用 `fieldOptionName`,Select 用 `withDisplayNames`,用户看到的必须是中文名称
235
- 4. [ ] `getSimpleData` 返回值直接 `item[字段ID]`,没有 `_raw` 层
236
- 5. [ ] Select 字段读写统一用选项 ID(`valueKey`),不是显示名称
237
- 6. [ ] React state 不直接修改,创建新对象 `var newForm = {}; Object.keys(form).forEach(...)`
238
- 7. [ ] entry.js 不引入 `@weapp/ui` 组件
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 { getSimpleData } from './api/formApi.js'; // entry.js 中可以直接引用
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
- const AgentSxxx = React.lazy(() => asyncImport('${appId}', 'pages/AgentSxxx'));
24
- // '${appId}' 是固定写法,是内置的ecode应用ID,不用管
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
- const { publicUrl } = appInfo('@weapp/ecodesdk');
40
- const extract = (
41
- <Route path={`${publicUrl}/sp/custom/abc123123/abc123`}> // 导出页面的具体路径
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
- regOvProps('weappEcodesdk', 'Switch', (props) => {
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
- const { publicUrl } = appInfo('@weapp/ecodesdk');
97
- const appId = '${appId}';
105
+ var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
98
106
 
99
- // 异步引入页面组件
100
- const MyPage = React.lazy(() => asyncImport('${appId}', 'pages/MyPage'));
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
- const myRoute = (
105
- <Route path={`${publicUrl}${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 | `const data = await getSimpleData(...)` |
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
- - **完整复刻用户提供的 HTML 时,样式一律内联进代码**(内联 style / 代码内样式对象),不要拆成独立 `.css` 文件:拆出去既不保证加载,也容易与页面结构脱节,复刻效果走样。
117
- - 少量页面样式用内联 style;确需独立 `.css` 文件时,确认它在 `build.json` 的 codes 里(首次自动生成时 `.css` 会登记为 `y`;文件是后加的要自行补登记),否则平台不合并加载。
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(() => asyncImport...)`
130
- 2. `${appId}` 是占位符,运行时由 ecode SDK 替换
131
- 3. 写完代码后运行 `e10-cli check <项目目录>` 逐条自检,全部确认通过后再 build
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
- | 定制页面 | 实现标准配置之外的交互 | 写目标页面、作用范围、发布与入口 | 验收实际加载和业务交互 | [页面编码](../coding/guide-page-code.md) |
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