weaver-e10-builder 1.5.16 → 1.6.4
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/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +4 -2
- package/dist/commands/auth.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-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-data.d.ts.map +1 -1
- package/dist/commands/form-data.js +49 -1
- package/dist/commands/form-data.js.map +1 -1
- package/dist/commands/form-ebuilder-scope.d.ts +21 -0
- package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
- package/dist/commands/form-ebuilder-scope.js +41 -8
- package/dist/commands/form-ebuilder-scope.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-code-reviewed.d.ts +3 -0
- package/dist/commands/form-layout-code-reviewed.d.ts.map +1 -0
- package/dist/commands/form-layout-code-reviewed.js +61 -0
- package/dist/commands/form-layout-code-reviewed.js.map +1 -0
- package/dist/commands/form-layout-describe.d.ts +3 -0
- package/dist/commands/form-layout-describe.d.ts.map +1 -0
- package/dist/commands/form-layout-describe.js +58 -0
- package/dist/commands/form-layout-describe.js.map +1 -0
- package/dist/commands/form-layout-diff.d.ts +3 -0
- package/dist/commands/form-layout-diff.d.ts.map +1 -0
- package/dist/commands/form-layout-diff.js +48 -0
- package/dist/commands/form-layout-diff.js.map +1 -0
- package/dist/commands/form-layout-document.d.ts +3 -0
- package/dist/commands/form-layout-document.d.ts.map +1 -0
- package/dist/commands/form-layout-document.js +81 -0
- package/dist/commands/form-layout-document.js.map +1 -0
- package/dist/commands/form-layout-edit.d.ts +3 -0
- package/dist/commands/form-layout-edit.d.ts.map +1 -0
- package/dist/commands/form-layout-edit.js +51 -0
- package/dist/commands/form-layout-edit.js.map +1 -0
- package/dist/commands/form-layout-init-reviewed.d.ts +3 -0
- package/dist/commands/form-layout-init-reviewed.d.ts.map +1 -0
- package/dist/commands/form-layout-init-reviewed.js +78 -0
- package/dist/commands/form-layout-init-reviewed.js.map +1 -0
- package/dist/commands/form-layout-restore.d.ts.map +1 -1
- package/dist/commands/form-layout-restore.js +23 -0
- package/dist/commands/form-layout-restore.js.map +1 -1
- package/dist/commands/form-layout-template-catalog.d.ts +3 -0
- package/dist/commands/form-layout-template-catalog.d.ts.map +1 -0
- package/dist/commands/form-layout-template-catalog.js +45 -0
- package/dist/commands/form-layout-template-catalog.js.map +1 -0
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +80 -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/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +12 -5
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add_compiler.js +5 -0
- package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete.d.ts +6 -1
- package/dist/services/actionflow/components/action_eb_delete.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js +23 -5
- package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete_compiler.js +22 -0
- package/dist/services/actionflow/components/action_eb_delete_compiler.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 -4
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +9 -2
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +2 -2
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +11 -10
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/event_button.js +1 -1
- package/dist/services/actionflow/components/event_button.js.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.d.ts +29 -1
- package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.js +67 -3
- package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
- package/dist/services/actionflow/components/time_batch_trigger.js +2 -2
- package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
- package/dist/services/actionflow/form_source.d.ts +44 -1
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +231 -5
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +8 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +120 -14
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/system_params.d.ts.map +1 -1
- package/dist/services/actionflow/system_params.js +4 -1
- package/dist/services/actionflow/system_params.js.map +1 -1
- package/dist/services/actionflow/trigger_common.d.ts.map +1 -1
- package/dist/services/actionflow/trigger_common.js +12 -3
- package/dist/services/actionflow/trigger_common.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +117 -40
- 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/form-layout-code-reviewed.d.ts +32 -0
- package/dist/services/form-layout-code-reviewed.d.ts.map +1 -0
- package/dist/services/form-layout-code-reviewed.js +101 -0
- package/dist/services/form-layout-code-reviewed.js.map +1 -0
- package/dist/services/form-layout-describe.d.ts +4 -0
- package/dist/services/form-layout-describe.d.ts.map +1 -0
- package/dist/services/form-layout-describe.js +107 -0
- package/dist/services/form-layout-describe.js.map +1 -0
- package/dist/services/form-layout-diff.d.ts +37 -0
- package/dist/services/form-layout-diff.d.ts.map +1 -0
- package/dist/services/form-layout-diff.js +232 -0
- package/dist/services/form-layout-diff.js.map +1 -0
- package/dist/services/form-layout-document-apply.d.ts +23 -0
- package/dist/services/form-layout-document-apply.d.ts.map +1 -0
- package/dist/services/form-layout-document-apply.js +82 -0
- package/dist/services/form-layout-document-apply.js.map +1 -0
- package/dist/services/form-layout-document.d.ts +13 -0
- package/dist/services/form-layout-document.d.ts.map +1 -0
- package/dist/services/form-layout-document.js +228 -0
- package/dist/services/form-layout-document.js.map +1 -0
- package/dist/services/form-layout-edit.d.ts +21 -0
- package/dist/services/form-layout-edit.d.ts.map +1 -0
- package/dist/services/form-layout-edit.js +103 -0
- package/dist/services/form-layout-edit.js.map +1 -0
- package/dist/services/form-layout-init-plan.d.ts +54 -0
- package/dist/services/form-layout-init-plan.d.ts.map +1 -0
- package/dist/services/form-layout-init-plan.js +211 -0
- package/dist/services/form-layout-init-plan.js.map +1 -0
- package/dist/services/form-layout-source/review.d.ts +4 -0
- package/dist/services/form-layout-source/review.d.ts.map +1 -0
- package/dist/services/form-layout-source/review.js +54 -0
- package/dist/services/form-layout-source/review.js.map +1 -0
- package/dist/services/form-layout-template-advanced.d.ts +5 -0
- package/dist/services/form-layout-template-advanced.d.ts.map +1 -1
- package/dist/services/form-layout-template-advanced.js +17 -1
- package/dist/services/form-layout-template-advanced.js.map +1 -1
- package/dist/services/form-layout-template-catalog.d.ts +13 -0
- package/dist/services/form-layout-template-catalog.d.ts.map +1 -0
- package/dist/services/form-layout-template-catalog.js +27 -0
- package/dist/services/form-layout-template-catalog.js.map +1 -0
- package/dist/services/form-layout-template-flow.d.ts +1 -1
- package/dist/services/form-layout-template-flow.d.ts.map +1 -1
- package/dist/services/form-layout-template-flow.js.map +1 -1
- package/dist/services/form-layout-template-verification.d.ts +34 -0
- package/dist/services/form-layout-template-verification.d.ts.map +1 -0
- package/dist/services/form-layout-template-verification.js +124 -0
- package/dist/services/form-layout-template-verification.js.map +1 -0
- package/dist/services/form-style-template.d.ts +3 -3
- package/dist/services/form-style-template.d.ts.map +1 -1
- package/dist/services/form-style-template.js +18 -13
- package/dist/services/form-style-template.js.map +1 -1
- package/package.json +1 -1
- package/skill-docs/SKILL.md +163 -155
- package/skill-docs/_catalog.md +110 -106
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +60 -3
- package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +35 -33
- 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/capability-boundaries.md +20 -1
- package/skill-docs/references/common/guide-plan-template.md +29 -3
- package/skill-docs/references/common/map.md +13 -8
- package/skill-docs/references/common/ref-cli-commands.md +31 -10
- package/skill-docs/references/components/display-FilePreview.md +5 -4
- package/skill-docs/references/form/guide-browser-definition.md +57 -13
- package/skill-docs/references/form/guide-create-form.md +258 -258
- 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/code-block-guide.md +153 -0
- package/skill-docs/references/form/layout/code-block/controls.md +60 -0
- package/skill-docs/references/form/layout/code-block/coverage.md +32 -0
- package/skill-docs/references/form/layout/code-block/details.md +57 -0
- package/skill-docs/references/form/layout/code-block/events-validation.md +42 -0
- package/skill-docs/references/form/layout/code-block/foundations-fields.md +56 -0
- package/skill-docs/references/form/layout/code-block/layout-css.md +116 -0
- package/skill-docs/references/form/layout/code-block/recipes.md +164 -0
- package/skill-docs/references/form/layout/code-block/troubleshooting.md +49 -0
- package/skill-docs/references/form/layout/code-block/ui-global.md +47 -0
- package/skill-docs/references/form/layout/document.md +39 -0
- package/skill-docs/references/form/layout/incremental.md +133 -0
- package/skill-docs/references/form/layout/initialization.md +39 -0
- package/skill-docs/references/form/layout/inspect-edit.md +76 -0
- package/skill-docs/references/form/layout/layout-overview.md +67 -0
- package/skill-docs/references/form/layout/management.md +64 -0
- package/skill-docs/references/form/layout/planning.md +76 -0
- package/skill-docs/references/form/layout/source-restoration.md +388 -0
- package/skill-docs/references/form/layout/template/advanced-css.md +167 -0
- package/skill-docs/references/form/layout/template/advanced.md +318 -0
- package/skill-docs/references/form/layout/template/easy.md +64 -0
- package/skill-docs/references/form/layout/template/flow.md +30 -0
- package/skill-docs/references/form/layout/template/template-guide.md +56 -0
- package/skill-docs/references/form/layout/workflow-layout.md +44 -0
- package/skill-docs/references/form/ref-form-fields.md +303 -301
- package/skill-docs/references/workflow/guide-workflow-node-layout.md +189 -187
- 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` 上传,否则用户无法验证(用户看不到本地代码)
|
|
@@ -10,6 +10,25 @@
|
|
|
10
10
|
|
|
11
11
|
1. 先查 `references/common/ref-cli-commands.md` 的对应命令与参数;
|
|
12
12
|
2. 再跑 `e10-cli <命令> --help` 确认当前版本有没有该选项;
|
|
13
|
-
3.
|
|
13
|
+
3. 能只读验证的,做一次只读查询或回读并记录结果;
|
|
14
|
+
4. 仍无法确认时,标「待环境核查」或「未证实」,不要猜;必要时问用户;
|
|
15
|
+
5. 已确认做不到或只能部分做到时,写进 `plan.md` 的 0.1 和「待确认、需补充及无法实现」一节,保持 `[ ]`。
|
|
14
16
|
|
|
15
17
|
**禁止绕行**:不要为了完成配置临时编写 `.mjs` 脚本调用内部接口,也不要让用户直接操作浏览器或设计器代替命令;确认没有命令时,保留该项未完成状态并说明影响。
|
|
18
|
+
|
|
19
|
+
## 证据等级(写预检结论 / 边界表时必填)
|
|
20
|
+
|
|
21
|
+
| 等级 | 含义 | 能否对外说「不支持」 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| 实测 | 有平台原始回执,或写后有独立回读 | 可以,注明环境和日期 |
|
|
24
|
+
| 回读字段 | 平台返回体里确有该字段,语义未必实测 | 不能直接判「不支持」 |
|
|
25
|
+
| 命令表 | 只能证明**当前 CLI 没暴露** | **不能**;命令没暴露不等于平台不支持 |
|
|
26
|
+
| 未证实 | 有结论、无证据 | **不能**对外宣称 |
|
|
27
|
+
|
|
28
|
+
> 「选项表/命令表」只证明执行器没暴露,不能升级成「平台不提供」。需要平台结论时,先补实测或回读证据;没有证据就写「待环境核查」。
|
|
29
|
+
|
|
30
|
+
## 边界记录格式
|
|
31
|
+
|
|
32
|
+
| 需求 | 结论 | 证据等级 | 依据 | 影响与处理 |
|
|
33
|
+
|---|---|---|---|---|
|
|
34
|
+
| <需求项> | 可做 / 部分可做 / 做不到 / 待环境核查 | 实测 / 回读字段 / 命令表 / 未证实 | <具体命令、回执或文档> | <保留未完成、替代方式或需用户决定> |
|