neo-cmp-cli 1.13.18 → 1.13.20
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/README.md +217 -600
- package/dist/neo/neoRequire.js +1 -1
- package/dist/package.json.js +1 -1
- package/package.json +1 -2
- package/template/asset-manage-template/package.json +2 -2
- package/template/echarts-custom-cmp-template/package.json +1 -1
- package/template/empty-custom-cmp-template/package.json +2 -2
- package/template/neo-bi-cmps/package.json +2 -2
- package/template/neo-bi-cmps/src/components/filterBar__c/common.scss +1 -1
- package/template/neo-bi-cmps/src/components/filterBar__c/index.tsx +18 -10
- package/template/neo-bi-cmps/src/components/filterBar__c/model.ts +8 -2
- package/template/neo-bi-cmps/src/utils/common.ts +18 -20
- package/template/neo-bi-cmps/src/utils/filter2chartFilter.ts +4 -6
- package/template/neo-bi-cmps/src/utils/pipelineFunnel.ts +4 -2
- package/template/neo-bi-cmps/src/utils/simpleTable.tsx +21 -16
- package/template/neo-custom-cmp-template/package.json +2 -2
- package/template/neo-custom-cmp-template/src/components/customApi__c/README.md +90 -0
- package/template/neo-custom-cmp-template/src/components/customApi__c/index.tsx +184 -0
- package/template/neo-custom-cmp-template/src/components/customApi__c/model.ts +53 -0
- package/template/neo-custom-cmp-template/src/components/customApi__c/style.scss +116 -0
- package/template/neo-custom-cmp-template/src/components/entityTable__c/index.tsx +5 -1
- package/template/neo-custom-cmp-template/src/components/simpleCmp__c/index.tsx +4 -1
- package/template/neo-h5-cmps/neo.config.js +1 -1
- package/template/neo-h5-cmps/package.json +2 -2
- package/template/neo-h5-cmps/src/components/entityList__c/index.tsx +0 -1
- package/template/neo-order-cmps/package.json +1 -1
- package/template/neo-pipeline-cmps/package.json +1 -1
- package/template/neo-pipeline-cmps/src/components/filterBar__c/model.ts +10 -2
- package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/index.tsx +1 -0
- package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/model.ts +14 -2
- package/template/neo-pipeline-cmps/src/components/pipelineFunnel__c/reset.scss +4 -0
- package/template/neo-pipeline-cmps/src/components/showHealthResult__c/index.tsx +2 -1
- package/template/neo-pipeline-cmps/src/components/stageSwitch__c/model.ts +14 -2
- package/template/neo-pipeline-cmps/src/components/stageTimeChart__c/model.ts +14 -2
- package/template/neo-web-entity-grid/package.json +1 -1
- package/template/neo-web-entity-grid/src/components/createForm__c/index.tsx +271 -259
- package/template/neo-web-entity-grid/src/components/createForm__c/model.ts +17 -3
- package/template/neo-web-entity-grid/src/components/createForm__c/resetAntd.scss +0 -1
- package/template/neo-web-entity-grid/src/components/createForm__c/style.scss +1 -1
- package/template/neo-web-entity-grid/src/components/entityGrid2__c/index.tsx +5 -1
- package/template/neo-web-entity-grid/src/components/entityGrid2__c/model.ts +4 -3
- package/template/neo-web-entity-grid/src/components/entityGrid3__c/index.tsx +1 -1
- package/template/neo-web-entity-grid/src/components/searchForm__c/index.tsx +4 -3
- package/template/neo-web-entity-grid/src/components/searchForm__c/model.ts +9 -4
- package/template/neo-web-entity-grid/src/components/searchForm__c/style.scss +2 -1
- package/template/neo-web-form/package.json +2 -2
- package/template/neo-web-form/src/components/batchAddTable__c/index.tsx +19 -19
- package/template/neo-web-form/src/components/batchAddTable__c/model.ts +11 -15
- package/template/neo-web-form/src/components/listSummary__c/index.tsx +6 -5
- package/template/react-custom-cmp-template/package.json +1 -1
- package/docs/H5/347/253/257 NeoEntityList /344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -293
- package/docs/Web/347/253/257 NeoEntityGrid /344/275/277/347/224/250/350/257/264/346/230/216.md" +0 -1206
- package/docs//345/217/257/347/224/250/345/261/236/346/200/247/351/205/215/347/275/256/351/241/271.md +0 -801
- package/docs//351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243/forward.zip +0 -0
- package/docs//351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243//350/207/252/345/256/232/344/271/211API:/351/200/232/347/224/250/344/273/243/347/220/206/346/216/245/345/217/243/344/275/277/347/224/250/350/257/264/346/230/216.md +0 -13
package/README.md
CHANGED
|
@@ -1,44 +1,45 @@
|
|
|
1
1
|
# Neo 自定义组件开发工具
|
|
2
2
|
|
|
3
|
-
neo-cmp-cli
|
|
3
|
+
**neo-cmp-cli** 是面向 Neo 平台的自定义组件开发工具。它基于 [AKFun](https://github.com/wibetter/akfun) 的工程能力,提供项目初始化、编译构建、本地预览与热更新、多技术栈支持以及发布到 NeoCRM 等能力。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 目录
|
|
6
6
|
|
|
7
7
|
- [主要特性](#主要特性)
|
|
8
8
|
- [内置模板](#内置模板)
|
|
9
9
|
- [快速开始](#快速开始)
|
|
10
10
|
- [命令参考](#命令参考)
|
|
11
|
-
- [
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
11
|
+
- [CLI 常见问题](#cli-使用相关常见问题)
|
|
12
|
+
- [登录与授权](#登录授权配置)
|
|
13
|
+
- [组件开发说明](#组件开发说明)
|
|
14
|
+
- [前端工程配置](#前端工程配置说明)
|
|
14
15
|
|
|
15
16
|
---
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## 主要特性
|
|
18
19
|
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
20
|
+
- **零配置**:内置符合前端工程实践的默认配置,开箱即用。
|
|
21
|
+
- **多技术栈**:支持 Vue2、React、React + TypeScript 等类型的自定义组件调试、构建与发布。
|
|
22
|
+
- **多种构建形态**:本地预览(含热更新与代理)、外链调试、库构建(UMD / ESM)、部署与发布。
|
|
23
|
+
- **灵活可配**:可配置构建入口、路径别名、代理、公共样式注入、ESLint / StyleLint、以及 Babel / Loader / Plugin 等扩展。
|
|
24
|
+
- **样式与规范**:内置 Autoprefixer、Sass、PostCSS、ESLint、StyleLint。
|
|
25
|
+
- **对接 NeoCRM**:支持将组件发布到 NeoCRM 平台(需按文档完成授权配置)。
|
|
25
26
|
|
|
26
|
-
##
|
|
27
|
+
## 内置模板
|
|
27
28
|
|
|
28
|
-
执行 `neo init` 时,CLI
|
|
29
|
+
执行 `neo init` 时,CLI 会以交互列表展示可选模板;若同时传入 `-t`(模板类型)与 `-n`(项目名称),可跳过交互,直接从本仓库 `template/` 目录初始化对应模板工程。
|
|
29
30
|
|
|
30
31
|
| 模板类型 | 说明 | 参考仓库 |
|
|
31
|
-
|
|
32
|
-
| `neo-web-entity-grid` | Web 端列表组件模板:含基础大列表、Picker
|
|
33
|
-
| `neo-h5-cmps` | H5 端业务组件模板:含全局搜索、数据列表、数据 Tabs、打开 AI
|
|
34
|
-
| `neo` |
|
|
35
|
-
| `neo-bi-cmps` |
|
|
36
|
-
| `echarts` | ECharts 组件模板:含基于 ECharts
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| `neo-web-entity-grid` | Web 端列表组件模板:含基础大列表、Picker 列表等示例 | (随 CLI 内置) |
|
|
34
|
+
| `neo-h5-cmps` | H5 端业务组件模板:含全局搜索、数据列表、数据 Tabs、打开 AI 对话页等示例 | [neo-h5-cmps](https://github.com/wibetter/neo-h5-cmps) |
|
|
35
|
+
| `neo` | 自定义业务组件模板:含实体表单、实体详情、实体数据表格等示例 | [neo-custom-cmp-template](https://github.com/wibetter/neo-custom-cmp-template) |
|
|
36
|
+
| `neo-bi-cmps` | 数值指标组件模板:可配置展示实体数据源中的指标数据 | [neo-bi-cmps](https://github.com/xsy-neoui/neo-bi-cmps) |
|
|
37
|
+
| `echarts` | ECharts 组件模板:含基于 ECharts 的图表示例(地图场景请使用 `amap` 模板) | [echarts-custom-cmp-template](https://github.com/wibetter/echarts-custom-cmp-template) |
|
|
37
38
|
| `antd` | Ant Design 组件模板:含数据仪表板、搜索组件等示例 | [antd-custom-cmp-template](https://github.com/wibetter/antd-custom-cmp-template) |
|
|
38
|
-
| `amap` | 地图组件模板:含基于高德地图 API
|
|
39
|
+
| `amap` | 地图组件模板:含基于高德地图 API 的示例 | [map-custom-cmp-template](https://github.com/wibetter/map-custom-cmp-template) |
|
|
39
40
|
| `vue2` | Vue2 组件模板:含基于 Vue2 的示例组件 | [vue2-custom-cmp-template](https://github.com/wibetter/vue2-custom-cmp-template) |
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
**非交互创建**(须同时提供 `-t` 与 `-n`)示例:
|
|
42
43
|
|
|
43
44
|
```bash
|
|
44
45
|
neo init -t neo-web-entity-grid -n myWebListCmp
|
|
@@ -50,27 +51,29 @@ neo init -t amap -n myMapCmp
|
|
|
50
51
|
neo init -t vue2 -n myVue2Cmp
|
|
51
52
|
```
|
|
52
53
|
|
|
53
|
-
>
|
|
54
|
+
> **说明**:在默认的本地拷贝模式下,若 `templateList` 中仍保留 `react-ts`、`react` 等目录,可通过 `neo init -t react-ts -n xxx` 等方式创建,但这些模板不会出现在上述交互列表中。`react`(非 TypeScript)模板在 CLI 侧已标记为废弃,建议优先选用上表中的模板。
|
|
54
55
|
|
|
55
56
|
---
|
|
56
57
|
|
|
57
|
-
##
|
|
58
|
+
## 快速开始
|
|
58
59
|
|
|
59
60
|
### 1. 安装工具
|
|
60
61
|
|
|
61
62
|
```bash
|
|
62
|
-
yarn global add neo-cmp-cli
|
|
63
|
+
yarn global add neo-cmp-cli --registry https://registry.npmmirror.com
|
|
63
64
|
# 或
|
|
64
|
-
npm i -g neo-cmp-cli
|
|
65
|
+
npm i -g neo-cmp-cli --registry=https://registry.npmmirror.com
|
|
65
66
|
```
|
|
66
67
|
|
|
68
|
+
> **说明**:示例命令使用 [npmmirror](https://www.npmmirror.com/) 镜像,以加快安装速度;也可改用默认 npm 源。
|
|
69
|
+
|
|
67
70
|
### 2. 创建项目
|
|
68
71
|
|
|
69
72
|
```bash
|
|
70
73
|
# 方式一:创建空的自定义组件项目
|
|
71
74
|
neo create project
|
|
72
75
|
|
|
73
|
-
#
|
|
76
|
+
# 方式二:按模板创建(交互选择模板;或使用 neo init -t <类型> -n <名称> 非交互)
|
|
74
77
|
neo init
|
|
75
78
|
```
|
|
76
79
|
|
|
@@ -90,710 +93,326 @@ yarn install
|
|
|
90
93
|
neo create cmp
|
|
91
94
|
```
|
|
92
95
|
|
|
93
|
-
|
|
96
|
+
默认在 `src/components/` 下新增自定义组件目录。
|
|
94
97
|
|
|
95
98
|
### 5. 本地预览
|
|
96
99
|
|
|
97
100
|
```bash
|
|
98
|
-
# 预览自定义组件内容
|
|
99
101
|
neo preview
|
|
100
102
|
```
|
|
101
103
|
|
|
102
|
-
|
|
104
|
+
命令成功执行后,一般会默认打开浏览器进行预览。
|
|
103
105
|
|
|
104
|
-
### 6. 外链调试(在 NeoCRM
|
|
106
|
+
### 6. 外链调试(在 NeoCRM / 页面设计器中调试)
|
|
105
107
|
|
|
106
108
|
```bash
|
|
107
109
|
neo linkDebug
|
|
108
110
|
```
|
|
109
111
|
|
|
110
|
-
> **提示**:需在 NeoCRM
|
|
112
|
+
> **提示**:需在 NeoCRM 或页面设计器中开启 debug 模式,并将控制台输出的外链脚本地址加入「外部链接」。详细步骤见下文 [本地调试自定义组件](#2-本地调试自定义组件)。
|
|
111
113
|
|
|
112
|
-
### 7. 发布到 NeoCRM
|
|
114
|
+
### 7. 发布到 NeoCRM
|
|
113
115
|
|
|
114
116
|
```bash
|
|
115
117
|
neo push cmp
|
|
116
118
|
```
|
|
117
119
|
|
|
118
|
-
>
|
|
120
|
+
> **提示**:发布前请确认 `package.json` 中 `name` 在平台内唯一、`version` 未与已发布版本冲突,并完成 NeoCRM 授权配置。详见 [发布自定义组件至 NeoCRM](#3-发布自定义组件至-neocrm)。
|
|
119
121
|
|
|
120
122
|
---
|
|
121
123
|
|
|
122
|
-
##
|
|
124
|
+
## 命令参考
|
|
123
125
|
|
|
124
126
|
| 命令 | 说明 | 参数 |
|
|
125
|
-
|
|
126
|
-
| `neo init` |
|
|
127
|
-
| `neo create project` |
|
|
128
|
-
| `neo create cmp` | 在当前项目中创建一个自定义组件 | `--name`
|
|
129
|
-
| `neo login` | 登录 NeoCRM
|
|
130
|
-
| `neo logout` | 登出 NeoCRM
|
|
131
|
-
| `neo preview` |
|
|
132
|
-
| `neo linkDebug` |
|
|
133
|
-
| `neo push cmp` | 构建并发布到 NeoCRM
|
|
134
|
-
| `neo pull cmp` |
|
|
135
|
-
| `neo delete cmp` |
|
|
136
|
-
|
|
137
|
-
## 常见问题
|
|
138
|
-
|
|
139
|
-
**Q1: 在 Windows VSCode 控制台执行 neo 相关命令出现报错**
|
|
140
|
-
A: 如果提示“在此系统上禁止运行脚本”,这个可能是 Windows 客户端的默认安全策略影响,可尝试在控制台输入以下命令解决:
|
|
127
|
+
| --- | --- | --- |
|
|
128
|
+
| `neo init` | 按模板创建自定义组件项目 | `-t` / `--type` 模板类型(见 [内置模板](#内置模板)),`-n` / `--name` 项目名称;两者同时传入时为非交互模式 |
|
|
129
|
+
| `neo create project` | 创建空项目(不含任何自定义组件) | `--name` 指定项目名称 |
|
|
130
|
+
| `neo create cmp` | 在当前项目中创建一个自定义组件 | `--name` 组件名,`--targetDevice` / `-d` 指定目标设备类型 |
|
|
131
|
+
| `neo login` | 登录 NeoCRM(OAuth2) | `-e` / `--env` 环境类型 |
|
|
132
|
+
| `neo logout` | 登出 NeoCRM | — |
|
|
133
|
+
| `neo preview` | 本地预览,默认支持热更新与接口代理。若组件依赖 `neo-ui-common` 或 `neo-ui-component-web`,则不支持本地预览 | `--name` 指定组件名 |
|
|
134
|
+
| `neo linkDebug` | 外链调试,在页面设计器中调试自定义组件 | `--platform` 调试设备类型,`--name` 组件名 |
|
|
135
|
+
| `neo push cmp` | 构建并发布到 NeoCRM | `--name` 组件名 |
|
|
136
|
+
| `neo pull cmp` | 从 NeoCRM 拉取线上组件到当前项目 | `--name` 组件名 |
|
|
137
|
+
| `neo delete cmp` | 删除 NeoCRM 上的指定自定义组件 | `--name` 组件名 |
|
|
141
138
|
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
## CLI 使用相关常见问题
|
|
140
|
+
|
|
141
|
+
**Q1:在 Windows 的 VS Code 终端中执行 `neo` 相关命令报错**
|
|
142
|
+
|
|
143
|
+
A:若提示「在此系统上禁止运行脚本」,多为 PowerShell 执行策略限制。可在当前用户范围放宽策略(需自行评估安全策略是否适用):
|
|
144
|
+
|
|
145
|
+
```powershell
|
|
146
|
+
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
|
|
144
147
|
```
|
|
145
148
|
|
|
146
|
-
|
|
149
|
+
> 说明:上述命令允许当前用户在 Windows 上执行脚本。更多背景见 Microsoft 文档:[about_Execution_Policies](https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.5)。
|
|
147
150
|
|
|
151
|
+
**Q2:提示「无法将“xxx”项识别为 cmdlet、函数、脚本文件或可运行程序的名称」**
|
|
152
|
+
|
|
153
|
+
A:多为 **PATH** 未包含 npm 全局可执行文件目录。可按下面步骤将 npm 全局路径加入 PATH(PowerShell 示例):
|
|
154
|
+
|
|
155
|
+
**步骤 1**:查看 npm 全局前缀路径
|
|
156
|
+
|
|
157
|
+
```powershell
|
|
158
|
+
$npmPath = npm config get prefix
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**步骤 2**:将路径加入当前会话的 PATH(立即生效)
|
|
162
|
+
|
|
163
|
+
```powershell
|
|
164
|
+
$env:PATH += ";$npmPath"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**步骤 3**:写入用户级环境变量(新开终端仍生效)
|
|
168
|
+
|
|
169
|
+
```powershell
|
|
170
|
+
[Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";$npmPath", "User")
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
> **说明**:若安装 Node.js 时未勾选安装必要工具等选项,也可能导致全局命令不可用;请结合本机安装方式排查。
|
|
148
174
|
|
|
149
175
|
---
|
|
150
176
|
|
|
151
|
-
##
|
|
177
|
+
## 登录授权配置
|
|
152
178
|
|
|
153
|
-
使用 `neo push cmp`、`neo pull cmp`、`neo delete cmp`
|
|
179
|
+
使用 `neo push cmp`、`neo pull cmp`、`neo delete cmp` 等与 NeoCRM 交互前,需要完成授权。
|
|
154
180
|
|
|
155
|
-
### 方式一:OAuth2
|
|
181
|
+
### 方式一:OAuth2 登录(推荐)
|
|
156
182
|
|
|
157
|
-
OAuth2
|
|
183
|
+
OAuth2 授权码模式无需在配置文件中保存账户密码,相对更安全。
|
|
158
184
|
|
|
159
185
|
#### 使用步骤
|
|
160
186
|
|
|
161
|
-
1. **登录 NeoCRM
|
|
187
|
+
1. **登录 NeoCRM**
|
|
188
|
+
|
|
162
189
|
```bash
|
|
163
190
|
neo login
|
|
164
191
|
```
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
-
|
|
169
|
-
-
|
|
170
|
-
-
|
|
171
|
-
|
|
172
|
-
|
|
192
|
+
|
|
193
|
+
典型流程:
|
|
194
|
+
|
|
195
|
+
- 自动打开浏览器进入授权页;
|
|
196
|
+
- 在浏览器中登录 NeoCRM(需选择对应租户);
|
|
197
|
+
- 授权成功后跳转回本地(携带 `code`);
|
|
198
|
+
- CLI 用 `code` 换取 Token,并写入项目内 `.neo-cli/token.json`。
|
|
199
|
+
|
|
200
|
+
2. **登出**
|
|
201
|
+
|
|
173
202
|
```bash
|
|
174
203
|
neo logout
|
|
175
204
|
```
|
|
176
|
-
|
|
177
|
-
功能:清除本地保存的 token 文件,下次使用需要重新登录。
|
|
178
205
|
|
|
179
|
-
|
|
206
|
+
会清除本地保存的 token,下次使用需重新登录。
|
|
207
|
+
|
|
208
|
+
##### 在 `neo login` 中选择「自定义环境」时的配置示例
|
|
180
209
|
|
|
181
210
|
```javascript
|
|
182
211
|
// neo.config.js
|
|
183
212
|
module.exports = {
|
|
184
213
|
neoConfig: {
|
|
185
214
|
neoBaseURL: 'https://crm-xx.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
186
|
-
loginURL: 'https://login-xx.xiaoshouyi.com/auc/oauth2/auth', //
|
|
187
|
-
tokenAPI: 'https://login-xx.xiaoshouyi.com/auc/oauth2/token', // Token
|
|
215
|
+
loginURL: 'https://login-xx.xiaoshouyi.com/auc/oauth2/auth', // 授权页 URL(获取 code)
|
|
216
|
+
tokenAPI: 'https://login-xx.xiaoshouyi.com/auc/oauth2/token', // 换取 Token 的接口
|
|
188
217
|
},
|
|
189
218
|
}
|
|
190
219
|
```
|
|
191
220
|
|
|
192
221
|
#### Token 有效期
|
|
193
222
|
|
|
194
|
-
- **access_token
|
|
195
|
-
- **refresh_token
|
|
196
|
-
- 系统会在 access_token
|
|
197
|
-
-
|
|
223
|
+
- **access_token**:默认约 2 小时有效;
|
|
224
|
+
- **refresh_token**:默认约 30 天有效;
|
|
225
|
+
- 系统会在 access_token 过期前约 5 分钟尝试自动刷新;
|
|
226
|
+
- 若 refresh_token 也过期,需重新执行 `neo login`。
|
|
227
|
+
|
|
228
|
+
#### 授权登录常见问题
|
|
229
|
+
|
|
230
|
+
**Q1:浏览器没有自动打开?**
|
|
231
|
+
|
|
232
|
+
A:命令行会打印授权 URL,复制到浏览器中打开即可。
|
|
198
233
|
|
|
199
|
-
|
|
234
|
+
**Q2:Token 刷新失败?**
|
|
200
235
|
|
|
201
|
-
|
|
202
|
-
A: 命令行会输出授权 URL,手动复制到浏览器中打开即可。
|
|
236
|
+
A:若 refresh_token 已过期,需重新执行 `neo login`;同时检查网络是否正常。
|
|
203
237
|
|
|
204
|
-
**
|
|
205
|
-
A: 如果 refresh_token 也过期(默认 30 天),需要重新执行 `neo login`。同时检查网络连接是否正常。
|
|
238
|
+
**Q3:登录后没有正确跳回 redirect_uri?**
|
|
206
239
|
|
|
207
|
-
**
|
|
208
|
-
A: 可能被浏览器安装的插件影响,目前已知会影响授权登录的浏览器插件有:Neo UI Extension,请关闭插件后重试。
|
|
240
|
+
A:可能被浏览器扩展干扰;已知 **Neo UI Extension** 可能影响授权流程,可暂时关闭后重试。
|
|
209
241
|
|
|
210
|
-
###
|
|
242
|
+
### 方式二:密码模式
|
|
211
243
|
|
|
212
|
-
|
|
244
|
+
在项目根目录 `neo.config.js` 中配置 NeoCRM 授权(示例):
|
|
213
245
|
|
|
214
246
|
```javascript
|
|
215
247
|
module.exports = {
|
|
216
248
|
neoConfig: {
|
|
217
249
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
218
|
-
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token
|
|
219
|
-
// NeoCRM 授权配置
|
|
250
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 接口
|
|
220
251
|
authType: 'password',
|
|
221
252
|
auth: {
|
|
222
|
-
client_id: 'xx', // 客户端 ID
|
|
223
|
-
client_secret: 'xxx', //
|
|
224
|
-
username: 'xx', //
|
|
253
|
+
client_id: 'xx', // 客户端 ID(连接器中的 Client_Id)
|
|
254
|
+
client_secret: 'xxx', // 客户端密钥(Client_Secret)
|
|
255
|
+
username: 'xx', // 销售易用户名
|
|
225
256
|
/**
|
|
226
|
-
* password
|
|
227
|
-
*
|
|
257
|
+
* password 为「账户密码 + 8 位安全令牌」直接拼接(无空格)。
|
|
258
|
+
* 例如密码为 123456、安全令牌为 ABCDEFGH,则填 123456ABCDEFGH。
|
|
228
259
|
*/
|
|
229
|
-
password: '
|
|
260
|
+
password: 'xxx', // 替换为实际「密码 + 安全令牌」
|
|
230
261
|
},
|
|
231
262
|
},
|
|
232
263
|
}
|
|
233
264
|
```
|
|
234
265
|
|
|
235
|
-
####
|
|
266
|
+
#### 如何获取配置项
|
|
236
267
|
|
|
237
|
-
1.
|
|
238
|
-
|
|
239
|
-
- 创建连接器后,从客户端信息中获取 `Client_Id` 和 `Client_Secret`
|
|
268
|
+
1. **client_id / client_secret**
|
|
269
|
+
通过「创建连接器」在客户端信息中获取 `Client_Id` 与 `Client_Secret`。可参考 [销售易文档中心](https://doc.xiaoshouyi.com) 中相关说明。
|
|
240
270
|
|
|
241
|
-
2.
|
|
242
|
-
|
|
243
|
-
- 按照文档说明获取 8 位安全令牌
|
|
244
|
-
- `password` 字段 = 用户账户密码 + 8 位安全令牌(直接拼接,无空格或分隔符)
|
|
271
|
+
2. **安全令牌与 password 字段**
|
|
272
|
+
在文档中心 OAuth 相关章节(如密码模式、获取令牌)按说明获取 8 位安全令牌;`password` 一般为「登录密码 + 8 位安全令牌」直接拼接(无额外空格或分隔符,具体以官方文档为准)。
|
|
245
273
|
|
|
246
|
-
### OAuth2
|
|
274
|
+
### OAuth2 与密码模式对比
|
|
247
275
|
|
|
248
276
|
| 特性 | OAuth2 授权码模式 | 密码模式 |
|
|
249
|
-
|
|
250
|
-
| 安全性 |
|
|
251
|
-
| Token 刷新 |
|
|
252
|
-
| 有效期 | 2
|
|
253
|
-
| 推荐程度 |
|
|
277
|
+
| --- | --- | --- |
|
|
278
|
+
| 安全性 | 较高(不在配置中存明文密码) | 较低(需配置密码与令牌) |
|
|
279
|
+
| Token 刷新 | 支持自动刷新 | 支持自动刷新 |
|
|
280
|
+
| 有效期 | access_token 约 2 小时(可刷新) | 视平台与 refresh 策略而定(见官方文档) |
|
|
281
|
+
| 推荐程度 | 优先推荐 | 备选 |
|
|
254
282
|
|
|
255
283
|
---
|
|
256
284
|
|
|
257
|
-
##
|
|
285
|
+
## 组件开发说明
|
|
258
286
|
|
|
259
287
|
### 1. 默认自动识别自定义组件
|
|
260
288
|
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
|
|
265
|
-
### 2. 设置自定义组件属性配置项
|
|
266
|
-
|
|
267
|
-
通过 `neo init` 初始化的自定义组件,默认自带组件模型文件,所有和页面设计器关联的信息均在此文件中定义(详细见 model 文件中的注释说明)。
|
|
268
|
-
|
|
269
|
-
自定义组件模型文件中可以设置的属性:
|
|
270
|
-
|
|
271
|
-
| 属性名 | 默认值 | 使用说明 |
|
|
272
|
-
|-------|------------------|---------------|
|
|
273
|
-
| cmpType | 在构建时根据当前组件目录名称自动生成 | 组件类型标识,用于标识组件的唯一性 |
|
|
274
|
-
| label | - | 组件名称,用于设置在编辑器左侧组件面板中展示的名称 |
|
|
275
|
-
| description | - | 组件描述,用于设置在编辑器左侧组件面板中展示的描述 |
|
|
276
|
-
| iconUrl | - | 组件图标,用于设置在编辑器左侧组件面板中展示的图标 |
|
|
277
|
-
| tags | ['自定义组件'] | 分类标签,用于设置在编辑器左侧组件面板哪个分类中展示 |
|
|
278
|
-
| exposedToDesigner | true | 是否在页面设计器端可见 |
|
|
279
|
-
| enableDuplicate | true | 在设计器中是否允许多次使用 |
|
|
280
|
-
| targetPage | ['all'] | 适配的页面类型 |
|
|
281
|
-
| targetObject | ['all'] | 支持的实体类型 |
|
|
282
|
-
| targetApplication | ['all'] | 支持的应用类型 |
|
|
283
|
-
| targetDevice | 'all' | 支持的设备类型 |
|
|
284
|
-
| defaultComProps | - | 初次插入页面的默认属性数据 |
|
|
285
|
-
| propsSchema | - | 定义组件在编辑器中可配置的属性 |
|
|
286
|
-
|
|
287
|
-
说明1:其中 `propsSchema` 用于添加自定义组件的属性配置面板,可用的配置项类型请见 [neo-register 使用文档](https://www.npmjs.com/package/neo-register)。
|
|
288
|
-
|
|
289
|
-
说明2:当前 NeoCRM 平台存在的页面类型:
|
|
290
|
-
- all: 所有页面类型
|
|
291
|
-
- indexPage: 首页
|
|
292
|
-
- entityListPage: 实体列表页
|
|
293
|
-
- entityFormPage: 实体表单页
|
|
294
|
-
- entityDetailPage: 实体详情页
|
|
295
|
-
- customPage: 自定义页面
|
|
296
|
-
- bizPage: 业务页面
|
|
297
|
-
|
|
298
|
-
### 3. 使用平台实体数据源
|
|
299
|
-
|
|
300
|
-
可在自定义组件中使用 OpenAPI SDK 对接平台实体数据源,详细使用方法见 [neo-open-api](https://www.npmjs.com/package/neo-open-api)。
|
|
301
|
-
|
|
302
|
-
```typescript
|
|
303
|
-
import { xObject } from 'neo-open-api';
|
|
304
|
-
|
|
305
|
-
// 查询联系人列表
|
|
306
|
-
const {data: contacts} = await xObject.query({
|
|
307
|
-
xObjectApiKey: 'Contact',
|
|
308
|
-
fields: ['name', 'phone', 'email'],
|
|
309
|
-
page: 1,
|
|
310
|
-
pageSize: 20,
|
|
311
|
-
orderBy: 'createdAt desc'
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
// 创建新联系人
|
|
315
|
-
const {data: newContact} = await xObject.create('Contact', {
|
|
316
|
-
data: {
|
|
317
|
-
name: '王五',
|
|
318
|
-
phone: '13700137000',
|
|
319
|
-
email: 'wangwu@example.com'
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
// 更新联系人
|
|
324
|
-
const {data: updatedContact} = await xObject.update('Contact', newContact.id, {
|
|
325
|
-
data: {
|
|
326
|
-
name: '王五(更新)'
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
// 获取联系人详情
|
|
331
|
-
const {data: contactDetail} = await xObject.get('Contact', newContact.id);
|
|
332
|
-
|
|
333
|
-
// 删除联系人
|
|
334
|
-
await xObject.delete('Contact', newContact.id);
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
### 4. 使用平台自定义API
|
|
339
|
-
|
|
340
|
-
可在自定义组件中使用 OpenAPI SDK 对接平台自定义API,详细使用方法见 [neo-open-api](https://www.npmjs.com/package/neo-open-api)。
|
|
341
|
-
|
|
342
|
-
```typescript
|
|
343
|
-
import { customApi } from 'neo-open-api';
|
|
344
|
-
|
|
345
|
-
// 基本用法
|
|
346
|
-
const result = await customApi.run({
|
|
347
|
-
apiUrl: '/rest/custom/api/endpoint', // 自定义API地址
|
|
348
|
-
methodType: 'POST', // 请求方法,如 'GET', 'POST', 'PUT', 'DELETE' 等(可选,默认为 'POST')
|
|
349
|
-
data: { // 请求数据
|
|
350
|
-
key1: 'value1',
|
|
351
|
-
key2: 'value2'
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
**参数说明:**
|
|
357
|
-
- `apiUrl`: 自定义API的完整地址(必填)
|
|
358
|
-
- `methodType` 或 `method`: 请求方法,默认为 'POST'
|
|
359
|
-
- `data`: 请求数据对象,会被包装在 `data` 字段中发送
|
|
360
|
-
|
|
361
|
-
**返回结果:**
|
|
362
|
-
```typescript
|
|
363
|
-
{
|
|
364
|
-
status: boolean, // 返回 true 表示执行成功
|
|
365
|
-
code: number | string, // 返回码
|
|
366
|
-
msg: string, // 一般用于返回错误信息
|
|
367
|
-
data: any // API返回的数据
|
|
368
|
-
}
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
**使用示例:**
|
|
372
|
-
```typescript
|
|
373
|
-
import { customApi } from 'neo-open-api';
|
|
374
|
-
|
|
375
|
-
// 执行自定义API
|
|
376
|
-
const result = await customApi.run({
|
|
377
|
-
apiUrl: '/rest/custom/api/processData',
|
|
378
|
-
methodType: 'POST',
|
|
379
|
-
data: {
|
|
380
|
-
param1: 'value1',
|
|
381
|
-
param2: 'value2'
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### 5. 添加事件动作
|
|
387
|
-
|
|
388
|
-
以下说明如何在自定义组件中添加 **可触发事件**、**可执行动作(组件函数)**,以及(不推荐)**广播事件**,以便在 Neo 页面设计器的属性面板 / 事件配置中完成事件与动作绑定。
|
|
389
|
-
|
|
390
|
-
#### 添加可触发的组件事件
|
|
391
|
-
|
|
392
|
-
**1. 在组件中添加可触发的事件**
|
|
393
|
-
|
|
394
|
-
**步骤 1:** 从 `neo-ui-common` 导入 `NeoEvent`。
|
|
395
|
-
|
|
396
|
-
> **备注:** 无需单独安装 `neo-ui-common`,组件在 Neo 平台运行时会自动注入。
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
// 引入 neo-ui-common / NeoEvent
|
|
400
|
-
// @ts-ignore
|
|
401
|
-
import { NeoEvent } from 'neo-ui-common';
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
**步骤 2:** 使用 `@NeoEvent.dispatch` 将某个方法声明为可由设计器绑定的触发事件方法。
|
|
405
|
-
|
|
406
|
-
```typescript
|
|
407
|
-
/**
|
|
408
|
-
* 表单提交事件
|
|
409
|
-
*/
|
|
410
|
-
@NeoEvent.dispatch
|
|
411
|
-
onSubmit() {
|
|
412
|
-
console.log('触发了表单提交事件:', this.props);
|
|
413
|
-
}
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
**2. 在组件模型中声明会触发的事件**
|
|
417
|
-
|
|
418
|
-
上述步骤仅在运行时定义了事件方法,页面设计器还不知道该组件对外暴露哪些事件,因此需要在 **组件模型**(如 `*Model` 描述类)中声明:
|
|
419
|
-
|
|
420
|
-
```typescript
|
|
421
|
-
/**
|
|
422
|
-
* @file Object Form 表单组件对接编辑器的描述文件
|
|
423
|
-
* @description 定义组件在 Neo 平台编辑器中的配置信息
|
|
424
|
-
*/
|
|
425
|
-
export class EntityFormModel {
|
|
426
|
-
// ... 组件模型其他内容
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
* 声明当前组件会触发的所有事件
|
|
430
|
-
* 备注:页面设计器端可用于进行事件绑定,在组件属性配置模式中配置事件动作
|
|
431
|
-
*/
|
|
432
|
-
events = [
|
|
433
|
-
{
|
|
434
|
-
apiKey: 'onSubmit', // 事件名称(需与组件方法名一致)
|
|
435
|
-
label: '提交表单后', // 设计器中展示的名称
|
|
436
|
-
helpText: '表单提交后触发该事件', // 信息图标 hover 时的提示文本
|
|
437
|
-
},
|
|
438
|
-
];
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
**3. 发布自定义组件**
|
|
443
|
-
|
|
444
|
-
发布后即可在页面设计器 / 属性配置面板中看到该组件可绑定的事件列表。
|
|
445
|
-
|
|
446
|
-
---
|
|
447
|
-
|
|
448
|
-
#### 添加可执行的组件动作(组件函数)
|
|
449
|
-
|
|
450
|
-
**1. 在组件中添加可执行的组件动作方法**
|
|
451
|
-
|
|
452
|
-
**步骤 1:** 导入 `NeoEvent`(同上,无需安装 `neo-ui-common`)。
|
|
453
|
-
|
|
454
|
-
```typescript
|
|
455
|
-
// 引入 neo-ui-common / NeoEvent
|
|
456
|
-
// @ts-ignore
|
|
457
|
-
import { NeoEvent } from 'neo-ui-common';
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
**步骤 2:** 使用 `@NeoEvent.function` 将方法声明为可被其他组件或事件流调用的 **组件动作**。
|
|
461
|
-
|
|
462
|
-
```typescript
|
|
463
|
-
/**
|
|
464
|
-
* 加载表格数据
|
|
465
|
-
* @param page 页码,默认为 1
|
|
466
|
-
* @param pageSize 每页条数,默认为 10
|
|
467
|
-
*/
|
|
468
|
-
@NeoEvent.function
|
|
469
|
-
async loadData(page = 1, pageSize = 10) {
|
|
470
|
-
const { xObjectApiKey } = this.props.xObjectDataApi || {};
|
|
471
|
-
if (!xObjectApiKey) return;
|
|
472
|
-
|
|
473
|
-
this.setState({ loading: true, error: null });
|
|
474
|
-
|
|
475
|
-
try {
|
|
476
|
-
const result = await xObject.query(this.props.xObjectDataApi);
|
|
477
|
-
|
|
478
|
-
if (result && result.status) {
|
|
479
|
-
const records = result.data || [];
|
|
480
|
-
const totalSize = result.totalSize || 0;
|
|
481
|
-
|
|
482
|
-
this.setState({
|
|
483
|
-
dataSource: records,
|
|
484
|
-
pagination: {
|
|
485
|
-
current: page,
|
|
486
|
-
pageSize,
|
|
487
|
-
total: totalSize,
|
|
488
|
-
},
|
|
489
|
-
loading: false,
|
|
490
|
-
});
|
|
491
|
-
} else {
|
|
492
|
-
this.setState({
|
|
493
|
-
error: result?.msg || '获取数据失败',
|
|
494
|
-
loading: false,
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
} catch (error: any) {
|
|
498
|
-
this.setState({
|
|
499
|
-
error: error.message || '获取数据失败',
|
|
500
|
-
loading: false,
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
```
|
|
505
|
-
【备注】 如果组件方法中涉及 this 的使用,请在 constructor 构造函数中 将当前组件上下文绑定方法,确保组件方法在外部执行时this不丢失。(比如: this.loadData = this.loadData.bind(this))
|
|
506
|
-
|
|
507
|
-
> 示例中使用了 `xObject.query`,请确保已从 `neo-open-api` 引入 `xObject`,并与实际业务 props 一致。
|
|
289
|
+
- **扫描与入口**:CLI 从 `src/components` 扫描子目录;子目录名为组件名;以目录下 `index.ts` / `tsx` / `js` / `jsx` 为组件入口,`model.ts` / `model.js` 为模型文件。
|
|
290
|
+
- **自动注册**:发布时会生成注册相关文件并注入构建流程,一般无需手写注册代码(参见 [neo-register](https://www.npmjs.com/package/neo-register))。
|
|
291
|
+
- **样式隔离**:发布或 `linkDebug` 时会对组件样式做隔离处理(默认处理目录下 `(index|style).(scss|less)` 等)。根节点请使用**与组件目录名一致**的类名(className),避免被样式隔离策略影响。若需关闭,可在 `neo.config.js` 或 webpack 相关配置中将 `disableAutoAddStyleScope` 设为 `true`。
|
|
508
292
|
|
|
509
|
-
|
|
293
|
+
### 2. 本地调试自定义组件
|
|
510
294
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
```typescript
|
|
514
|
-
/**
|
|
515
|
-
* @file XObject 表格组件对接编辑器的描述文件
|
|
516
|
-
* @description 定义组件在 Neo 平台编辑器中的配置信息
|
|
517
|
-
*/
|
|
518
|
-
export class EntityFormModel {
|
|
519
|
-
// ... 组件模型其他内容
|
|
520
|
-
|
|
521
|
-
// 当前组件支持的函数列表(其他组件可触发当前组件的函数)
|
|
522
|
-
functions = [
|
|
523
|
-
{
|
|
524
|
-
apiKey: 'loadData',
|
|
525
|
-
label: '刷新表格',
|
|
526
|
-
helpTextKey: '刷新当前表格数据',
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
apiKey: 'handleDelete',
|
|
530
|
-
label: '删除记录',
|
|
531
|
-
helpTextKey: '删除表格中指定记录',
|
|
532
|
-
funcInParams: [
|
|
533
|
-
{
|
|
534
|
-
apiKey: 'id',
|
|
535
|
-
label: '记录ID',
|
|
536
|
-
type: 'String',
|
|
537
|
-
required: true,
|
|
538
|
-
},
|
|
539
|
-
],
|
|
540
|
-
},
|
|
541
|
-
];
|
|
542
|
-
}
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
**3. 发布自定义组件**
|
|
546
|
-
|
|
547
|
-
发布后在页面设计器 / 属性配置面板 / 事件配置面板中可看到并选用上述组件函数(组件动作)。
|
|
548
|
-
|
|
549
|
-
---
|
|
550
|
-
|
|
551
|
-
#### 广播事件(不推荐使用)
|
|
552
|
-
|
|
553
|
-
全局广播自由度高、难以追踪,请优先使用 **可触发事件 + 组件函数** 的声明式能力。
|
|
554
|
-
|
|
555
|
-
**1. 在组件中触发广播事件**
|
|
556
|
-
|
|
557
|
-
```typescript
|
|
558
|
-
// @ts-ignore
|
|
559
|
-
import { NeoEvent } from 'neo-ui-common';
|
|
560
|
-
|
|
561
|
-
componentDidMount() {
|
|
562
|
-
// ... 其他代码
|
|
563
|
-
console.log('触发了一个广播事件 entityFormInit。');
|
|
564
|
-
NeoEvent.broadcast('entityFormInit', this.props);
|
|
565
|
-
}
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
**2. 在组件中接收广播事件**
|
|
569
|
-
|
|
570
|
-
```typescript
|
|
571
|
-
// @ts-ignore
|
|
572
|
-
import { NeoEvent } from 'neo-ui-common';
|
|
573
|
-
|
|
574
|
-
componentDidMount() {
|
|
575
|
-
// ... 其他代码
|
|
576
|
-
NeoEvent.listen('entityFormInit', (eventData: any) => {
|
|
577
|
-
console.log('EntityCardList 监听到了广播事件 entityFormInit: ', eventData);
|
|
578
|
-
// ... 其他逻辑
|
|
579
|
-
});
|
|
580
|
-
}
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
事件名在 `broadcast` 与 `listen` 中需保持一致。
|
|
584
|
-
|
|
585
|
-
### 6. 默认复用平台第三方依赖
|
|
586
|
-
|
|
587
|
-
自定义组件构建过程中默认会剔除掉平台已有依赖模块(比如 antd、echarts、axios、lodash 等),确保自定义组件构建后的资源体积较小。
|
|
588
|
-
|
|
589
|
-
#### 平台预置的第三方依赖包
|
|
590
|
-
|
|
591
|
-
自定义组件可直接使用以下第三方依赖包(NeoCRM 平台预置):
|
|
592
|
-
|
|
593
|
-
| 依赖包 | 版本 |
|
|
594
|
-
|--------|------|
|
|
595
|
-
| react | ^16.13.1 |
|
|
596
|
-
| react-dom | ^16.13.1 |
|
|
597
|
-
| mobx | ^6.3.0 |
|
|
598
|
-
| mobx-react | ^7.0.0 |
|
|
599
|
-
| mobx-state-tree | ^5.4.0 |
|
|
600
|
-
| echarts | 5.4.2 |
|
|
601
|
-
| antd | 4.9.4 |
|
|
602
|
-
| antd-mobile | 2.3.4 |
|
|
603
|
-
| @ant-design/icons | ^4.8.0 |
|
|
604
|
-
| video-react | 0.14.1 |
|
|
605
|
-
| axios | ^0.27.2 |
|
|
606
|
-
| classnames | ^2.3.2 |
|
|
607
|
-
| qs | ^6.11.0 |
|
|
608
|
-
| lodash | ^4.17.21 |
|
|
609
|
-
| neo-ui-component-web | ^1.0.0 |
|
|
610
|
-
| neo-ui-common | ^1.0.0 |
|
|
611
|
-
| neo-open-api | ^1.1.9 |
|
|
612
|
-
| amis | ^1.1.5 |
|
|
613
|
-
|
|
614
|
-
> **注意**:自定义组件中请使用依赖包支持的版本,如版本不匹配运行时可能出现异常。
|
|
615
|
-
|
|
616
|
-
### 7. 本地调试自定义组件
|
|
617
|
-
|
|
618
|
-
#### 步骤 1:启动外链调试模式
|
|
295
|
+
#### 步骤 1:启动外链调试
|
|
619
296
|
|
|
620
297
|
```bash
|
|
621
298
|
neo linkDebug
|
|
622
299
|
```
|
|
623
300
|
|
|
624
|
-
|
|
301
|
+
成功后,终端会输出可使用的脚本地址(常见为 `http://localhost:1024/index.js`)。
|
|
625
302
|
|
|
626
|
-
#### 步骤 2
|
|
303
|
+
#### 步骤 2:在设计器中开启 debug
|
|
627
304
|
|
|
628
|
-
在页面设计器 URL
|
|
305
|
+
在页面设计器 URL 后追加 `debug=true` 并重新访问。
|
|
629
306
|
|
|
630
|
-
#### 步骤 3
|
|
307
|
+
#### 步骤 3:添加外链脚本
|
|
631
308
|
|
|
632
|
-
|
|
309
|
+
在设计器左侧「外部链接」面板中,将上一步输出的脚本地址加入,即可在物料中看到对应自定义组件。
|
|
633
310
|
|
|
634
|
-
###
|
|
311
|
+
### 3. 发布自定义组件至 NeoCRM
|
|
635
312
|
|
|
636
|
-
执行 `neo push cmp`
|
|
313
|
+
执行 `neo push cmp` 会构建组件并将资源发布到 NeoCRM(含平台 CDN 流程,以实际环境为准)。
|
|
637
314
|
|
|
638
|
-
####
|
|
315
|
+
#### 用法
|
|
639
316
|
|
|
640
317
|
```bash
|
|
641
|
-
#
|
|
318
|
+
# 交互选择要发布的组件
|
|
642
319
|
neo push cmp
|
|
643
320
|
|
|
644
|
-
#
|
|
321
|
+
# 指定组件名
|
|
645
322
|
neo push cmp --name=xxCmp
|
|
646
323
|
# 或
|
|
647
324
|
neo push cmp -n xxCmp
|
|
648
325
|
```
|
|
649
326
|
|
|
650
|
-
####
|
|
327
|
+
#### 发布前检查
|
|
651
328
|
|
|
652
|
-
-
|
|
653
|
-
-
|
|
654
|
-
-
|
|
655
|
-
-
|
|
656
|
-
-
|
|
329
|
+
- `package.json` 中 **`name`** 在 NeoCRM 中唯一;
|
|
330
|
+
- **`version`** 与已发布版本不冲突(每次发布按需递增);
|
|
331
|
+
- 已完成 **NeoCRM 授权**(`neo.config.js` 或 `neo login`);
|
|
332
|
+
- 组件能 **正常构建**,`dist` 中有对应产物;
|
|
333
|
+
- 组件目录存在 **`model.ts` 或 `model.js`**,且正确导出模型。
|
|
657
334
|
|
|
658
335
|
#### 注意事项
|
|
659
336
|
|
|
660
|
-
-
|
|
661
|
-
-
|
|
662
|
-
-
|
|
663
|
-
-
|
|
664
|
-
|
|
665
|
-
|
|
337
|
+
- 发布前务必更新 `version`,避免冲突;
|
|
338
|
+
- 组件名 / 包名在平台内需唯一;
|
|
339
|
+
- 技术栈需与项目配置一致(React、React+TS、Vue2 等);
|
|
340
|
+
- 发布过程需稳定访问 NeoCRM 与对象存储等相关服务。
|
|
341
|
+
|
|
342
|
+
#### 发布常见问题
|
|
666
343
|
|
|
667
|
-
|
|
344
|
+
**Q:提示「未找到 NeoCRM 平台授权配置」?**
|
|
668
345
|
|
|
669
|
-
|
|
670
|
-
A: 请检查 `neo.config.js` 文件中是否配置了 `neoConfig.auth`,或使用 `neo login` 进行 OAuth2 登录授权。
|
|
346
|
+
A:检查 `neo.config.js` 是否配置 `neoConfig.auth`,或先执行 `neo login`。
|
|
671
347
|
|
|
672
|
-
**Q
|
|
673
|
-
A: 请确保组件目录下有 `model.ts` 或 `model.js` 文件,且构建后在 `dist` 目录下生成了对应的 `xxCmpModel.js` 文件。
|
|
348
|
+
**Q:提示「未找到自定义组件模型文件」?**
|
|
674
349
|
|
|
675
|
-
|
|
676
|
-
A: 请检查 `neo.config.js` 文件中是否配置了 `neoConfig.auth`,确保所有授权字段都已正确填写。
|
|
350
|
+
A:确认存在 `model.ts` / `model.js`,且构建产物中含对应的 `xxCmpModel.js`。
|
|
677
351
|
|
|
678
|
-
|
|
352
|
+
**Q:提示「获取 token 失败(授权配置错误)」?**
|
|
679
353
|
|
|
680
|
-
|
|
354
|
+
A:核对 `neo.config.js` 中授权字段是否完整、正确。
|
|
681
355
|
|
|
682
|
-
|
|
356
|
+
#### 在 NeoCRM 中使用
|
|
683
357
|
|
|
684
|
-
|
|
358
|
+
发布成功后,可在对应租户下的页面设计器、表单设计器等环境中使用该组件。
|
|
685
359
|
|
|
686
|
-
|
|
360
|
+
### 4. 拉取线上组件到本地
|
|
361
|
+
|
|
362
|
+
`neo pull cmp` 会从 NeoCRM 拉取组件源码到当前项目的 `src/components`。
|
|
687
363
|
|
|
688
364
|
```bash
|
|
689
|
-
# 方式一:交互式选择要拉取的自定义组件
|
|
690
365
|
neo pull cmp
|
|
691
|
-
|
|
692
|
-
# 方式二:直接指定要拉取的自定义组件名称
|
|
693
366
|
neo pull cmp --name=xxCmp
|
|
694
|
-
# 或
|
|
695
367
|
neo pull cmp -n xxCmp
|
|
696
368
|
```
|
|
697
369
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
- ✅ **已配置 NeoCRM 平台授权信息**(`neo.config.js` 中的 `neoConfig.auth` 或使用 `neo login`)
|
|
701
|
-
- ✅ **当前项目目录中不存在同名自定义组件**(`./src/components` 目录下)
|
|
702
|
-
- ✅ **拉取的组件与当前项目技术栈一致**(React、React+TS、Vue2 等)
|
|
370
|
+
**拉取前**:已完成授权;`./src/components` 下不存在同名目录;线上组件技术栈与当前项目一致。
|
|
703
371
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
- 拉取的自定义组件会覆盖本地同名组件,请谨慎操作
|
|
707
|
-
- 如果组件源码中包含新增的依赖包,拉取完成后会提示执行 `npm install` 或 `yarn install`
|
|
708
|
-
- zip 源文件会保留在 `.neo-cli/zip-source` 目录下,可手动删除
|
|
372
|
+
**注意**:会覆盖本地同名目录;若有新依赖,拉取后按提示执行 `npm install` / `yarn install`;zip 等中间文件可能留在 `.neo-cli/zip-source`,可按需清理。
|
|
709
373
|
|
|
710
|
-
###
|
|
374
|
+
### 5. 删除线上自定义组件
|
|
711
375
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
#### 使用方式
|
|
376
|
+
`neo delete cmp` 会从 NeoCRM **删除**指定组件,删除后设计器中无法再选用(请谨慎操作)。
|
|
715
377
|
|
|
716
378
|
```bash
|
|
717
|
-
# 方式一:交互式选择要删除的自定义组件
|
|
718
379
|
neo delete cmp
|
|
719
|
-
|
|
720
|
-
# 方式二:直接指定要删除的自定义组件名称
|
|
721
380
|
neo delete cmp --name=xxCmp
|
|
722
|
-
# 或
|
|
723
381
|
neo delete cmp -n xxCmp
|
|
724
382
|
```
|
|
725
383
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
- ✅ **已配置 NeoCRM 平台授权信息**(`neo.config.js` 中的 `neoConfig.auth` 或使用 `neo login`)
|
|
729
|
-
- ✅ **确认要删除的组件名称正确**,删除操作不可恢复
|
|
730
|
-
|
|
731
|
-
#### 注意事项
|
|
732
|
-
|
|
733
|
-
- ⚠️ **删除操作不可恢复**:删除后的自定义组件将无法恢复,请谨慎操作
|
|
734
|
-
- ⚠️ **影响范围**:删除组件后,所有使用该组件的页面和表单将受到影响,请确保没有正在使用的场景
|
|
735
|
-
- 💡 **建议先备份**:删除前建议先使用 `neo pull cmp` 拉取组件源码到本地进行备份
|
|
736
|
-
|
|
737
|
-
### 11. 自定义组件之间实现模块共享
|
|
738
|
-
|
|
739
|
-
**步骤 1**:在自定义组件A(customCmpA)/ 配置文件中定义要共享出来的模块A(xxModuleA)
|
|
740
|
-
|
|
741
|
-
```javascript
|
|
742
|
-
// customCmpA 组件的 neo.config.js
|
|
743
|
-
module.exports = {
|
|
744
|
-
neoCommonModule: {
|
|
745
|
-
// exports: ['xxModule'], // 数组写法,用于导出当前自定义组件中的第三方依赖模块
|
|
746
|
-
exports: { 'xxModuleA': path.resolve('./src/components/xxModuleA') }, // 对象写法,可用于导出自定义组件中的某个内容模块(需要使用绝对路径导出)
|
|
747
|
-
},
|
|
748
|
-
}
|
|
749
|
-
```
|
|
750
|
-
|
|
751
|
-
**步骤 2**:在自定义组件B(customCmpB)/ 配置文件中声明需要使用自定义组件 A 分享出来的模块(xxModuleA)
|
|
752
|
-
|
|
753
|
-
```javascript
|
|
754
|
-
// customCmpB 组件的 neo.config.js
|
|
755
|
-
module.exports = {
|
|
756
|
-
neoCommonModule: {
|
|
757
|
-
remoteDeps: ['customCmpA'], // 远程依赖(自定义组件),表示当前自定义组件 B 会用到哪些自定义组件
|
|
758
|
-
externals: ['xxModuleA'], // 自定义组件中需要剔除的外部模块(远程自定义组件中分享出来的模块),仅支持数组写法,需要和 remoteDeps 配合使用
|
|
759
|
-
},
|
|
760
|
-
}
|
|
761
|
-
```
|
|
762
|
-
|
|
763
|
-
**步骤 3**:在自定义组件B 中使用自定义组件 A 分享出来的模块(xxModuleA)
|
|
384
|
+
**删除前**:已完成授权;再次确认组件名。**删除不可恢复**,且会影响已引用该组件的页面 / 表单;建议必要时先用 `neo pull cmp` 备份源码。
|
|
764
385
|
|
|
765
|
-
|
|
766
|
-
import xxModuleA from 'xxModuleA'; // 导入自定义组件 A 共享出来的模块
|
|
767
|
-
```
|
|
386
|
+
---
|
|
768
387
|
|
|
769
|
-
##
|
|
388
|
+
## 前端工程配置说明
|
|
770
389
|
|
|
771
|
-
neo-cmp-cli
|
|
390
|
+
neo-cmp-cli 内置一套完整默认配置;若需自定义,可执行 `neo config init` 生成 `neo.config.js` 后按需修改。
|
|
772
391
|
|
|
773
|
-
|
|
392
|
+
以下为常用配置片段(可按需组合)。
|
|
774
393
|
|
|
775
394
|
### 基础配置
|
|
776
395
|
|
|
777
|
-
#### 1.
|
|
396
|
+
#### 1. 代码规范(ESLint / StyleLint)
|
|
778
397
|
|
|
779
398
|
```javascript
|
|
780
399
|
module.exports = {
|
|
781
400
|
settings: {
|
|
782
|
-
enableESLint: true, //
|
|
783
|
-
enableESLintFix: false, //
|
|
784
|
-
enableStyleLint: true, //
|
|
785
|
-
enableStyleLintFix: false //
|
|
401
|
+
enableESLint: true, // 是否启用 ESLint
|
|
402
|
+
enableESLintFix: false, // 是否自动修复 ESLint 问题
|
|
403
|
+
enableStyleLint: true, // 是否启用 StyleLint
|
|
404
|
+
enableStyleLintFix: false, // 是否自动修复 StyleLint 问题
|
|
786
405
|
},
|
|
787
406
|
}
|
|
788
407
|
```
|
|
789
408
|
|
|
790
|
-
#### 2.
|
|
409
|
+
#### 2. 构建入口
|
|
791
410
|
|
|
792
|
-
>
|
|
411
|
+
> **提示**:未配置 `entry` 时,CLI 默认扫描 `src/components` 并生成各组件的 entry。
|
|
793
412
|
|
|
794
|
-
优先级:`linkDebug/build2lib/pushCmp
|
|
413
|
+
优先级:`linkDebug` / `build2lib` / `pushCmp` 的 `entry` > `webpack.entry`。
|
|
795
414
|
|
|
796
|
-
|
|
415
|
+
自定义示例:
|
|
797
416
|
|
|
798
417
|
```javascript
|
|
799
418
|
module.exports = {
|
|
@@ -806,56 +425,55 @@ module.exports = {
|
|
|
806
425
|
}
|
|
807
426
|
```
|
|
808
427
|
|
|
809
|
-
>
|
|
428
|
+
> 更多说明见 Webpack 文档:[entry](https://www.webpackjs.com/configuration/entry-context/#entry)。
|
|
810
429
|
|
|
811
|
-
#### 3.
|
|
430
|
+
#### 3. 解析(extensions / alias)
|
|
812
431
|
|
|
813
432
|
```javascript
|
|
814
433
|
module.exports = {
|
|
815
434
|
webpack: {
|
|
816
435
|
resolve: {
|
|
817
|
-
extensions: ['.js', '.jsx', '.vue', 'json'],
|
|
436
|
+
extensions: ['.js', '.jsx', '.vue', '.json'],
|
|
818
437
|
alias: {},
|
|
819
438
|
},
|
|
820
439
|
},
|
|
821
440
|
}
|
|
822
441
|
```
|
|
823
442
|
|
|
824
|
-
>
|
|
825
|
-
> -
|
|
826
|
-
> - alias 的详细配置方法请查看 Webpack 官网 [关于resolve-alias的配置方法](https://www.webpackjs.com/configuration/resolve/#resolve-alias)
|
|
443
|
+
> - [resolve.extensions](https://www.webpackjs.com/configuration/resolve/#resolve-extensions)
|
|
444
|
+
> - [resolve.alias](https://www.webpackjs.com/configuration/resolve/#resolve-alias)
|
|
827
445
|
|
|
828
|
-
#### 4.
|
|
446
|
+
#### 4. 页面模板与公共样式
|
|
829
447
|
|
|
830
448
|
```javascript
|
|
831
449
|
module.exports = {
|
|
832
450
|
webpack: {
|
|
833
|
-
template: '', //
|
|
834
|
-
sassResources: [], //
|
|
451
|
+
template: '', // 自定义 HTML 模板路径
|
|
452
|
+
sassResources: [], // 作为全局注入的 Sass 资源(变量、mixin 等)
|
|
835
453
|
},
|
|
836
454
|
}
|
|
837
455
|
```
|
|
838
456
|
|
|
839
457
|
### 高级配置
|
|
840
458
|
|
|
841
|
-
#### 5.
|
|
459
|
+
#### 5. 依赖打包策略(ignoreNodeModules)
|
|
842
460
|
|
|
843
461
|
```javascript
|
|
844
462
|
module.exports = {
|
|
845
463
|
webpack: {
|
|
846
|
-
ignoreNodeModules: true, //
|
|
847
|
-
allowList: [], //
|
|
464
|
+
ignoreNodeModules: true, // 是否忽略 node_modules(默认 false)
|
|
465
|
+
allowList: [], // ignoreNodeModules 为 true 时仍打入 bundle 的包
|
|
848
466
|
},
|
|
849
467
|
}
|
|
850
468
|
```
|
|
851
469
|
|
|
852
|
-
#### 6. TypeScript
|
|
470
|
+
#### 6. TypeScript 声明与扫描目录
|
|
853
471
|
|
|
854
472
|
```javascript
|
|
855
473
|
module.exports = {
|
|
856
474
|
webpack: {
|
|
857
|
-
createDeclaration: false, //
|
|
858
|
-
projectDir: ['./src'], //
|
|
475
|
+
createDeclaration: false, // 是否生成 .d.ts
|
|
476
|
+
projectDir: ['./src'], // 生效目录,可多个;默认 ['./src']
|
|
859
477
|
},
|
|
860
478
|
}
|
|
861
479
|
```
|
|
@@ -875,7 +493,7 @@ module.exports = {
|
|
|
875
493
|
}
|
|
876
494
|
```
|
|
877
495
|
|
|
878
|
-
#### 8.
|
|
496
|
+
#### 8. 本地预览代理与 HTTPS
|
|
879
497
|
|
|
880
498
|
```javascript
|
|
881
499
|
module.exports = {
|
|
@@ -886,11 +504,10 @@ module.exports = {
|
|
|
886
504
|
}
|
|
887
505
|
```
|
|
888
506
|
|
|
889
|
-
>
|
|
890
|
-
> -
|
|
891
|
-
> - 启用 HTTPS 后,若浏览器提示不安全,可在 Chrome 地址栏打开 `chrome://flags/#allow-insecure-localhost` 并设置为 Enabled
|
|
507
|
+
> - [devServer.proxy](https://www.webpackjs.com/configuration/dev-server/#devserver-proxy)
|
|
508
|
+
> - 启用 HTTPS 后若浏览器提示不安全,可在 Chrome 中打开 `chrome://flags/#allow-insecure-localhost` 并启用对应选项(以浏览器版本为准)。
|
|
892
509
|
|
|
893
|
-
#### 9. 库构建(UMD/ESM)
|
|
510
|
+
#### 9. 库构建(UMD / ESM)
|
|
894
511
|
|
|
895
512
|
```javascript
|
|
896
513
|
module.exports = {
|
|
@@ -910,14 +527,14 @@ module.exports = {
|
|
|
910
527
|
}
|
|
911
528
|
```
|
|
912
529
|
|
|
913
|
-
#### 10. 自定义 Loader / Plugin / Babel
|
|
530
|
+
#### 10. 自定义 Loader / Plugin / Babel 插件
|
|
914
531
|
|
|
915
532
|
```javascript
|
|
916
533
|
module.exports = {
|
|
917
534
|
webpack: {
|
|
918
|
-
moduleRules: [],
|
|
919
|
-
plugins: [],
|
|
920
|
-
babelPlugins: [
|
|
535
|
+
moduleRules: [],
|
|
536
|
+
plugins: [],
|
|
537
|
+
babelPlugins: [
|
|
921
538
|
[
|
|
922
539
|
'component',
|
|
923
540
|
{ libraryName: 'element-ui', styleLibraryName: 'theme-chalk' },
|
|
@@ -927,9 +544,9 @@ module.exports = {
|
|
|
927
544
|
}
|
|
928
545
|
```
|
|
929
546
|
|
|
930
|
-
>
|
|
547
|
+
> 上例常用于 [Element UI 按需引入](https://element.eleme.cn/#/zh-CN/component/quickstart#an-xu-yin-ru)。
|
|
931
548
|
|
|
932
|
-
|
|
549
|
+
也支持用函数动态调整内置 Babel 插件列表:
|
|
933
550
|
|
|
934
551
|
```javascript
|
|
935
552
|
module.exports = {
|
|
@@ -944,4 +561,4 @@ module.exports = {
|
|
|
944
561
|
|
|
945
562
|
---
|
|
946
563
|
|
|
947
|
-
|
|
564
|
+
更多细节请参考各模板项目与源码内注释。
|