neo-cmp-cli 1.7.5 → 1.7.6
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 +351 -197
- package/package.json +7 -5
- package/src/config/auth.config.js +25 -0
- package/src/config/default.config.js +25 -0
- package/src/initData/neo.config.js +20 -11
- package/src/module/index.js +135 -93
- package/src/module/main.js +6 -5
- package/src/module/neoInitByCopy.js +4 -3
- package/src/neo/neoLogin.js +545 -0
- package/src/neo/neoService.js +98 -13
- package/src/template/antd-custom-cmp-template/neo.config.js +19 -10
- package/src/template/echarts-custom-cmp-template/neo.config.js +20 -11
- package/src/template/empty-custom-cmp-template/neo.config.js +19 -10
- package/src/template/neo-custom-cmp-template/neo.config.js +15 -6
- package/src/template/react-custom-cmp-template/neo.config.js +19 -10
- package/src/template/react-ts-custom-cmp-template/neo.config.js +19 -10
- package/src/template/vue2-custom-cmp-template/README.md +79 -5
- package/src/template/vue2-custom-cmp-template/neo.config.js +19 -10
- package/test/deprecate-versions.js +1 -1
package/src/neo/neoService.js
CHANGED
|
@@ -5,12 +5,14 @@ const path = require('path');
|
|
|
5
5
|
const ora = require('ora');
|
|
6
6
|
const _ = require('lodash');
|
|
7
7
|
const { resolve } = require('akfun');
|
|
8
|
+
const NeoLoginService = require('./neoLogin');
|
|
8
9
|
const updatePublishLog = require('../utils/projectUtils/updatePublishLog');
|
|
9
10
|
const { getFramework, errorLog, successLog } = require('../utils/common');
|
|
10
11
|
|
|
11
12
|
// NeoCRM 平台默认 API 配置
|
|
12
13
|
const NeoCrmAPI = {
|
|
13
14
|
neoBaseURL: 'https://crm.xiaoshouyi.com', // 平台根地址
|
|
15
|
+
loginAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // code 获取接口地址
|
|
14
16
|
tokenAPI: 'https://login.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址
|
|
15
17
|
uploadAPI: '/rest/metadata/v3.0/ui/customComponents/actions/upload', // 文件上传接口地址
|
|
16
18
|
delete: '/rest/metadata/v3.0/ui/customComponents',
|
|
@@ -48,28 +50,51 @@ class NeoService {
|
|
|
48
50
|
/**
|
|
49
51
|
* 初始化 Neo 服务
|
|
50
52
|
* @param {object} config 配置信息
|
|
53
|
+
* @param {string} config.authType 授权类型,可选值:oauth2(默认)、password
|
|
51
54
|
* @param {string} config.neoBaseURL Neo 平台根地址
|
|
52
55
|
* @param {string} config.tokenAPI Token 获取接口地址
|
|
56
|
+
* @param {string} config.loginURL OAuth2 登录授权 URL(OAuth2 模式需要)
|
|
53
57
|
* @param {object} config.auth 授权信息
|
|
54
58
|
* @param {string} config.auth.client_id 客户端 ID
|
|
55
59
|
* @param {string} config.auth.client_secret 客户端密钥
|
|
56
|
-
* @param {string} config.auth.username
|
|
57
|
-
* @param {string} config.auth.password
|
|
60
|
+
* @param {string} config.auth.username 用户名(password 模式需要)
|
|
61
|
+
* @param {string} config.auth.password 密码(password 模式需要)
|
|
58
62
|
*/
|
|
59
63
|
constructor(config = {}) {
|
|
60
|
-
const { assetsRoot, neoBaseURL, tokenAPI, auth } = config || {};
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
const { assetsRoot, neoBaseURL, tokenAPI, loginURL, auth, authType } = config || {};
|
|
65
|
+
|
|
66
|
+
// 设置授权类型,默认为 oauth2
|
|
67
|
+
this.authType = authType || 'oauth2';
|
|
68
|
+
|
|
69
|
+
if (this.authType === 'password' && !auth) {
|
|
70
|
+
errorLog('密码授权模式时,neo.config.js / neoConfig / auth 配置不能为空');
|
|
71
|
+
process.exit(1);
|
|
63
72
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
)
|
|
73
|
+
|
|
74
|
+
// 根据授权类型验证必需的配置项
|
|
75
|
+
if (this.authType === 'password') {
|
|
76
|
+
if (!auth.client_id || !auth.client_secret || !auth.username || !auth.password) {
|
|
77
|
+
errorLog(
|
|
78
|
+
'neo.config.js / neoConfig / auth 配置不完整(password 模式),需要包含 client_id、client_secret、username、password'
|
|
79
|
+
);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
} else if (this.authType === 'oauth2') {
|
|
83
|
+
if (!loginURL || !tokenAPI) {
|
|
84
|
+
errorLog(
|
|
85
|
+
'neo.config.js / neoConfig 配置不完整(oauth2 模式),需要包含 loginURL、tokenAPI 配置。'
|
|
86
|
+
);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
errorLog(`不支持的授权类型: ${this.authType},可选值:oauth2、password`);
|
|
91
|
+
process.exit(1);
|
|
68
92
|
}
|
|
69
93
|
|
|
70
94
|
this.assetsRoot = assetsRoot || resolve('dist');
|
|
71
95
|
this.neoBaseURL = neoBaseURL || NeoCrmAPI.neoBaseURL;
|
|
72
96
|
this.tokenAPI = tokenAPI || NeoCrmAPI.tokenAPI;
|
|
97
|
+
this.loginURL = loginURL || NeoCrmAPI.loginAPI;
|
|
73
98
|
this.auth = auth;
|
|
74
99
|
this.cmpList = [];
|
|
75
100
|
this.cmpInfoMap = {};
|
|
@@ -117,10 +142,30 @@ class NeoService {
|
|
|
117
142
|
|
|
118
143
|
/**
|
|
119
144
|
* 获取 token(含授权信息、租户信息)
|
|
145
|
+
* 根据 authType 自动选择授权模式:oauth2 或 password
|
|
120
146
|
* @returns {Promise<string>} token
|
|
121
147
|
*/
|
|
122
148
|
async getToken() {
|
|
123
|
-
|
|
149
|
+
// 检查缓存是否有效
|
|
150
|
+
if (!this.isTokenExpired()) {
|
|
151
|
+
return this.tokenCache.token;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 根据授权类型选择对应的获取方式
|
|
155
|
+
if (this.authType === 'oauth2') {
|
|
156
|
+
return await this.getTokenByOAuth2();
|
|
157
|
+
} else {
|
|
158
|
+
return await this.getTokenByPassword();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* 使用密码模式获取 token
|
|
164
|
+
* @returns {Promise<string>} token
|
|
165
|
+
*/
|
|
166
|
+
async getTokenByPassword() {
|
|
167
|
+
const spinner = ora('获取 token(密码模式)...').start();
|
|
168
|
+
|
|
124
169
|
// 检查缓存是否有效
|
|
125
170
|
if (!this.isTokenExpired()) {
|
|
126
171
|
successLog('使用缓存的 token。', spinner);
|
|
@@ -176,6 +221,43 @@ class NeoService {
|
|
|
176
221
|
}
|
|
177
222
|
}
|
|
178
223
|
|
|
224
|
+
/**
|
|
225
|
+
* 获取 OAuth2 授权码模式的 token
|
|
226
|
+
* @returns {Promise<string>} token
|
|
227
|
+
*/
|
|
228
|
+
async getTokenByOAuth2() {
|
|
229
|
+
const spinner = ora('获取 token(OAuth2 模式)...').start();
|
|
230
|
+
|
|
231
|
+
try {
|
|
232
|
+
// 构建 OAuth2 配置
|
|
233
|
+
const oauth2Config = {
|
|
234
|
+
loginURL: this.loginURL,
|
|
235
|
+
tokenAPI: this.tokenAPI
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const loginService = new NeoLoginService(oauth2Config);
|
|
239
|
+
const accessToken = await loginService.getAccessToken();
|
|
240
|
+
|
|
241
|
+
// 缓存 token(OAuth2 模式下的 token 有效期由 NeoLoginService 管理)
|
|
242
|
+
// 这里我们设置一个较长的过期时间,实际过期检查由 NeoLoginService 内部处理
|
|
243
|
+
this.tokenCache = {
|
|
244
|
+
token: accessToken,
|
|
245
|
+
expiresAt: Date.now() + 7200 * 1000 // 默认 2 小时,实际由 NeoLoginService 管理
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
spinner.clear();
|
|
249
|
+
spinner.stop();
|
|
250
|
+
return accessToken;
|
|
251
|
+
} catch (error) {
|
|
252
|
+
errorLog('获取 token 失败(OAuth2 模式)', spinner);
|
|
253
|
+
errorLog(`\n获取 token 失败: ${error.message}`);
|
|
254
|
+
if (error.response) {
|
|
255
|
+
errorLog(`响应数据: ${JSON.stringify(error.response.data)}`);
|
|
256
|
+
}
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
179
261
|
/**
|
|
180
262
|
* 刷新 token
|
|
181
263
|
* @returns {Promise<string>} 新的 token
|
|
@@ -516,7 +598,8 @@ class NeoService {
|
|
|
516
598
|
const { code, message } = response.data || {};
|
|
517
599
|
|
|
518
600
|
if (code && code !== 200) {
|
|
519
|
-
|
|
601
|
+
errorLog(`获取自定义组件列表失败: ${message || '未知错误'}`);
|
|
602
|
+
process.exit(1);
|
|
520
603
|
}
|
|
521
604
|
|
|
522
605
|
this.updateCustomCmpList(response.data.data || []);
|
|
@@ -542,7 +625,8 @@ class NeoService {
|
|
|
542
625
|
const token = await this.ensureValidToken();
|
|
543
626
|
|
|
544
627
|
if (!cmpType) {
|
|
545
|
-
|
|
628
|
+
errorLog('自定义组件名称不能为空。');
|
|
629
|
+
process.exit(1);
|
|
546
630
|
}
|
|
547
631
|
|
|
548
632
|
let fullDeleteAPI = this.buildFullUrl(NeoCrmAPI.delete);
|
|
@@ -558,7 +642,8 @@ class NeoService {
|
|
|
558
642
|
const { code, message } = response.data || {};
|
|
559
643
|
|
|
560
644
|
if (code && code !== 200) {
|
|
561
|
-
|
|
645
|
+
errorLog(`删除自定义组件失败: ${message || '未知错误'}`);
|
|
646
|
+
process.exit(1);
|
|
562
647
|
}
|
|
563
648
|
|
|
564
649
|
return response.data;
|
|
@@ -103,22 +103,31 @@ module.exports = {
|
|
|
103
103
|
}
|
|
104
104
|
*/
|
|
105
105
|
},
|
|
106
|
-
// NeoCRM 平台配置
|
|
106
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
107
107
|
neoConfig: {
|
|
108
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
108
109
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
110
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
111
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
109
112
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
110
|
-
|
|
113
|
+
},
|
|
114
|
+
/*
|
|
115
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
116
|
+
neoConfig: {
|
|
117
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
118
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
119
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
120
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
111
121
|
auth: {
|
|
112
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
113
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
114
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
*/
|
|
119
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
122
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
123
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
124
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
125
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
126
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
127
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
120
128
|
},
|
|
121
129
|
},
|
|
130
|
+
*/
|
|
122
131
|
pushCmp: {
|
|
123
132
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
124
133
|
/*
|
|
@@ -44,7 +44,7 @@ module.exports = {
|
|
|
44
44
|
// exports: ['xxModule'], // 数组写法,用于导出当前自定义组件中的第三方依赖模块
|
|
45
45
|
exports: {
|
|
46
46
|
// 对象写法,可用于导出自定义组件中的某个内容模块(需要使用绝对路径导出)
|
|
47
|
-
|
|
47
|
+
chartWidget: path.resolve('./src/components/chartWidget'), // 导出图表自定义组件
|
|
48
48
|
'neo-register': 'neo-register', // 导出 Neo 注册模块
|
|
49
49
|
},
|
|
50
50
|
// remoteDeps: ['xxCmpType'], // 远程依赖组件,表示当前自定义组件会用到的依赖组件,需要和 externals 配合使用
|
|
@@ -99,22 +99,31 @@ module.exports = {
|
|
|
99
99
|
}
|
|
100
100
|
*/
|
|
101
101
|
},
|
|
102
|
-
// NeoCRM 平台配置
|
|
102
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
103
103
|
neoConfig: {
|
|
104
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
104
105
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
106
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
107
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
105
108
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
106
|
-
|
|
109
|
+
},
|
|
110
|
+
/*
|
|
111
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
112
|
+
neoConfig: {
|
|
113
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
114
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
115
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
116
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
107
117
|
auth: {
|
|
108
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
109
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
110
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
*/
|
|
115
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
118
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
119
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
120
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
121
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
122
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
123
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
116
124
|
},
|
|
117
125
|
},
|
|
126
|
+
*/
|
|
118
127
|
pushCmp: {
|
|
119
128
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
120
129
|
/*
|
|
@@ -97,22 +97,31 @@ module.exports = {
|
|
|
97
97
|
}
|
|
98
98
|
*/
|
|
99
99
|
},
|
|
100
|
-
// NeoCRM 平台配置
|
|
100
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
101
101
|
neoConfig: {
|
|
102
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
102
103
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
104
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
105
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
103
106
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
104
|
-
|
|
107
|
+
},
|
|
108
|
+
/*
|
|
109
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
110
|
+
neoConfig: {
|
|
111
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
112
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
113
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
114
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
105
115
|
auth: {
|
|
106
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
107
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
108
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
*/
|
|
113
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
116
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
117
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
118
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
119
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
120
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
121
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
114
122
|
},
|
|
115
123
|
},
|
|
124
|
+
*/
|
|
116
125
|
pushCmp: {
|
|
117
126
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
118
127
|
/*
|
|
@@ -105,22 +105,31 @@ module.exports = {
|
|
|
105
105
|
}
|
|
106
106
|
*/
|
|
107
107
|
},
|
|
108
|
-
// NeoCRM 平台配置
|
|
108
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
109
109
|
neoConfig: {
|
|
110
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
110
111
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
112
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
113
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
111
114
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
112
|
-
|
|
115
|
+
},
|
|
116
|
+
/*
|
|
117
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
118
|
+
neoConfig: {
|
|
119
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
120
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
121
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
122
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
113
123
|
auth: {
|
|
114
124
|
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
115
125
|
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
116
126
|
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
120
|
-
*/
|
|
127
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
128
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
121
129
|
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
122
130
|
},
|
|
123
131
|
},
|
|
132
|
+
*/
|
|
124
133
|
pushCmp: {
|
|
125
134
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
126
135
|
/*
|
|
@@ -96,22 +96,31 @@ module.exports = {
|
|
|
96
96
|
}
|
|
97
97
|
*/
|
|
98
98
|
},
|
|
99
|
-
// NeoCRM 平台配置
|
|
99
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
100
100
|
neoConfig: {
|
|
101
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
101
102
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
103
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
104
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
102
105
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
103
|
-
|
|
106
|
+
},
|
|
107
|
+
/*
|
|
108
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
109
|
+
neoConfig: {
|
|
110
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
111
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
112
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
113
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
104
114
|
auth: {
|
|
105
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
106
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
107
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
*/
|
|
112
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
115
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
116
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
117
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
118
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
119
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
120
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
113
121
|
},
|
|
114
122
|
},
|
|
123
|
+
*/
|
|
115
124
|
pushCmp: {
|
|
116
125
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
117
126
|
/*
|
|
@@ -97,22 +97,31 @@ module.exports = {
|
|
|
97
97
|
}
|
|
98
98
|
*/
|
|
99
99
|
},
|
|
100
|
-
// NeoCRM 平台配置
|
|
100
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
101
101
|
neoConfig: {
|
|
102
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
102
103
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
104
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
105
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
103
106
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
104
|
-
|
|
107
|
+
},
|
|
108
|
+
/*
|
|
109
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
110
|
+
neoConfig: {
|
|
111
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
112
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
113
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
114
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
105
115
|
auth: {
|
|
106
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
107
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
108
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
*/
|
|
113
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
116
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
117
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
118
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
119
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
120
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
121
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
114
122
|
},
|
|
115
123
|
},
|
|
124
|
+
*/
|
|
116
125
|
pushCmp: {
|
|
117
126
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
118
127
|
/*
|
|
@@ -43,12 +43,64 @@ $ npm run linkDebug
|
|
|
43
43
|
$ npm run pushCmp
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
### 🔐 授权配置
|
|
47
|
+
|
|
48
|
+
使用 `neo push cmp`、`neo pull cmp`、`neo delete cmp` 等命令与 NeoCRM 平台交互时,需要配置授权信息。
|
|
49
|
+
|
|
50
|
+
#### 方式一:OAuth2 登录授权(推荐)
|
|
51
|
+
|
|
52
|
+
OAuth2 授权码模式更加安全可靠,且支持 token 自动刷新。
|
|
53
|
+
|
|
54
|
+
##### 使用步骤
|
|
55
|
+
|
|
56
|
+
1. **登录 NeoCRM 平台**
|
|
57
|
+
```bash
|
|
58
|
+
neo login
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
执行流程:
|
|
62
|
+
- 自动打开浏览器访问授权页面
|
|
63
|
+
- 在浏览器中输入 NeoCRM 账号密码进行登录
|
|
64
|
+
- 授权成功后自动跳转回本地
|
|
65
|
+
- Token 自动保存到项目的 `.neo-cli/token.json` 文件中
|
|
66
|
+
|
|
67
|
+
2. **登出 NeoCRM 平台**
|
|
68
|
+
```bash
|
|
69
|
+
neo logout
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
功能:清除本地保存的 token 文件,下次使用需要重新登录。
|
|
73
|
+
|
|
74
|
+
##### 配置示例
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
// neo.config.js
|
|
78
|
+
module.exports = {
|
|
79
|
+
neoConfig: {
|
|
80
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
81
|
+
// 登录授权 URL(用于获取 code)
|
|
82
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth',
|
|
83
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
##### Token 有效期
|
|
89
|
+
|
|
90
|
+
- **access_token**:默认有效期 2 小时
|
|
91
|
+
- **refresh_token**:默认有效期 30 天
|
|
92
|
+
- 系统会在 access_token 过期前 5 分钟自动刷新
|
|
93
|
+
- 如果 refresh_token 也过期,需要重新执行 `neo login`
|
|
94
|
+
|
|
95
|
+
#### 方式二:密码授权配置
|
|
96
|
+
|
|
97
|
+
在项目根目录的 `neo.config.js` 文件中添加 NeoCRM 平台授权配置:
|
|
98
|
+
|
|
47
99
|
```javascript
|
|
48
100
|
module.exports = {
|
|
49
101
|
neoConfig: {
|
|
50
102
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
51
|
-
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token
|
|
103
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址
|
|
52
104
|
// NeoCRM 授权配置
|
|
53
105
|
auth: {
|
|
54
106
|
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
@@ -63,9 +115,31 @@ module.exports = {
|
|
|
63
115
|
},
|
|
64
116
|
}
|
|
65
117
|
```
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
118
|
+
|
|
119
|
+
##### 授权配置获取方式
|
|
120
|
+
|
|
121
|
+
1. **客户端 ID 和客户端秘钥**:需通过创建连接器获取
|
|
122
|
+
- 访问 [销售易文档中心](https://doc.xiaoshouyi.com) / 创建连接器
|
|
123
|
+
- 创建连接器后,从客户端信息中获取 `Client_Id` 和 `Client_Secret`
|
|
124
|
+
|
|
125
|
+
2. **安全令牌**:如何获取安全令牌
|
|
126
|
+
- 访问 [销售易文档中心](https://doc.xiaoshouyi.com) / OAuth安全认证 / 密码模式 / 获取令牌
|
|
127
|
+
- 按照文档说明获取 8 位安全令牌
|
|
128
|
+
- `password` 字段 = 用户账户密码 + 8 位安全令牌(直接拼接,无空格或分隔符)
|
|
129
|
+
|
|
130
|
+
#### OAuth2 模式 vs 密码模式
|
|
131
|
+
|
|
132
|
+
| 特性 | OAuth2 授权码模式 | 密码模式 |
|
|
133
|
+
|------|------------------|---------|
|
|
134
|
+
| 安全性 | ✅ 高(无需在配置文件中存储密码) | ⚠️ 较低(需要配置密码和安全令牌) |
|
|
135
|
+
| Token 刷新 | ✅ 自动刷新 | ✅ 自动刷新 |
|
|
136
|
+
| 有效期 | 2 小时(可自动刷新) | 2 小时(可自动刷新) |
|
|
137
|
+
| 推荐程度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
|
|
138
|
+
|
|
139
|
+
> **建议**:优先使用 OAuth2 授权码模式(`neo login`),更加安全便捷。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
69
143
|
|
|
70
144
|
### 配置项说明(neo-cmp-cli)
|
|
71
145
|
[请查看neo-cmp-cli](https://github.com/wibetter/neo-cmp-cli)
|
|
@@ -105,22 +105,31 @@ module.exports = {
|
|
|
105
105
|
cssSourceMap: true
|
|
106
106
|
*/
|
|
107
107
|
},
|
|
108
|
-
// NeoCRM 平台配置
|
|
108
|
+
// 授权码授权模式下的 NeoCRM 平台配置
|
|
109
109
|
neoConfig: {
|
|
110
|
+
authType: 'oauth2', // 授权类型,可选值:oauth2(默认)、password
|
|
110
111
|
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
112
|
+
// 当 authType 为 oauth2 时,loginURL 配置项必填
|
|
113
|
+
loginURL: 'https://login-cd.xiaoshouyi.com/auc/oauth2/auth', // 登录授权 URL(默认:https://login.xiaoshouyi.com/auc/oauth2/auth)
|
|
111
114
|
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
112
|
-
|
|
115
|
+
},
|
|
116
|
+
/*
|
|
117
|
+
// 密码授权模式下的 NeoCRM 平台配置
|
|
118
|
+
neoConfig: {
|
|
119
|
+
authType: 'password', // 授权类型,可选值:oauth2(默认)、password
|
|
120
|
+
neoBaseURL: 'https://crm-cd.xiaoshouyi.com', // 平台根地址(默认:https://crm.xiaoshouyi.com)
|
|
121
|
+
tokenAPI: 'https://login-cd.xiaoshouyi.com/auc/oauth2/token', // Token 获取接口地址(默认:https://login.xiaoshouyi.com/auc/oauth2/token)
|
|
122
|
+
// 当 authType 为 password 时,auth 配置项必填
|
|
113
123
|
auth: {
|
|
114
|
-
client_id: 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
115
|
-
client_secret: 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
116
|
-
username: 'xx', // 用户在销售易系统中的用户名
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
*/
|
|
121
|
-
password: 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
124
|
+
client_id: auth.client_id || 'xx', // 客户端 ID,从创建连接器的客户端信息中获取(Client_Id)
|
|
125
|
+
client_secret: auth.client_secret || 'xxx', // 客户端秘钥,从创建连接器的客户端信息中获取(Client_Secret)
|
|
126
|
+
username: auth.username || 'xx', // 用户在销售易系统中的用户名
|
|
127
|
+
// password 为 用户在销售易系统中的账号密码加上 8 位安全令牌。
|
|
128
|
+
// 例如,用户密码为 123456,安全令牌为 ABCDEFGH,则 password 的值应为 123456ABCDEFGH。
|
|
129
|
+
password: auth.password || 'xx xx', // 用户账户密码 + 8 位安全令牌
|
|
122
130
|
},
|
|
123
131
|
},
|
|
132
|
+
*/
|
|
124
133
|
pushCmp: {
|
|
125
134
|
// 用于构建并发布至 NeoCRM 的相关配置
|
|
126
135
|
/*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { execSync } = require('child_process');
|
|
2
2
|
|
|
3
3
|
// 所有需要废弃的版本(1.6.2 之前的所有版本)
|
|
4
|
-
const versionsToDeprecate = ["1.6.3"];
|
|
4
|
+
const versionsToDeprecate = ["1.6.5", "1.6.6", "1.6.7", "1.6.8", "1.7.0", "1.7.1", "1.7.2", "1.7.3"];
|
|
5
5
|
|
|
6
6
|
const packageName = 'neo-cmp-cli';
|
|
7
7
|
const deprecateMessage = '此版本为开发中版本(存在 bug),请升级到最新版本。';
|