apass-opensdk-hugong 1.0.1 → 1.0.3
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/index.js +10 -5
- package/package.json +2 -2
- package/readme.md +46 -13
- package/utils/file_.js +81 -0
- package/utils/index.js +8 -0
- package/utils/url.js +1 -1
package/index.js
CHANGED
|
@@ -170,10 +170,12 @@ class HG{
|
|
|
170
170
|
if(Array.isArray(zh)){
|
|
171
171
|
//开放平台一般返回内容
|
|
172
172
|
if(zh[0].hasOwnProperty('lang')){
|
|
173
|
-
|
|
173
|
+
const _zh = this.toSafeValue(zh.find(it=>it.lang == 'zh-CN'),'value')
|
|
174
|
+
const _en = this.toSafeValue(zh.find(it=>it.lang == 'en-US'),'value')
|
|
175
|
+
return new application.constants.type.Multilingual({ zh: _zh || _en, en: _en || _zh })
|
|
174
176
|
}
|
|
175
177
|
}
|
|
176
|
-
return new application.constants.type.Multilingual({ zh, en })
|
|
178
|
+
return new application.constants.type.Multilingual({ zh: zh || en, en: en || zh })
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
/**
|
|
@@ -184,14 +186,17 @@ class HG{
|
|
|
184
186
|
* @returns
|
|
185
187
|
*/
|
|
186
188
|
toSafeValue(obj,key,defValue){
|
|
187
|
-
|
|
189
|
+
const _obj = obj || {}
|
|
190
|
+
if(!_obj){
|
|
188
191
|
return defValue
|
|
189
192
|
}
|
|
190
|
-
if(!
|
|
193
|
+
if(!_obj.hasOwnProperty(key)){
|
|
191
194
|
return defValue
|
|
192
195
|
}
|
|
193
|
-
return
|
|
196
|
+
return _obj[key] || defValue
|
|
194
197
|
}
|
|
195
198
|
|
|
199
|
+
|
|
200
|
+
|
|
196
201
|
}
|
|
197
202
|
module.exports = HG
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apass-opensdk-hugong",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "飞书Apass低代码平台-飞书开放平台-相关的接口整合和常用的方法整合",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"APASS",
|
|
15
15
|
"feish"
|
|
16
16
|
],
|
|
17
|
-
"author": "IAMRuiyu",
|
|
17
|
+
"author": "微信:IAMRuiyu",
|
|
18
18
|
"license": "ISC"
|
|
19
19
|
}
|
package/readme.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# apass-opensdk-hugong
|
|
2
2
|
## 简介
|
|
3
|
-
apass-opensdk-hugong 是一个基于apass-opensdk
|
|
3
|
+
apass-opensdk-hugong 是一个基于apass-opensdk的封装,提供了一些常用的功能
|
|
4
4
|
- 什么人可以使用这个SDK
|
|
5
5
|
- 从事飞书低代码平台(APASS)开发人员.
|
|
6
6
|
|
|
@@ -8,14 +8,28 @@ apass-opensdk-hugong 是一个基于apass-opensdk的封装,提供了一些常
|
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
在飞书低代码平台(云函数)依赖管理-右侧-搜索: apass-opensdk-hugong
|
|
11
|
+
|
|
12
|
+
最近有同学私聊我说Apass无法安装1.0.0以上的包,解决思路: 先安装1.0.0版本,然后打开yarn.lock文件
|
|
13
|
+
====== 找到这一行 =====
|
|
14
|
+
apass-opensdk-hugong@1.0.0:
|
|
15
|
+
version "1.0.0"
|
|
16
|
+
resolved "https://registry.npmmirror.com/apass-opensdk-hugong/-/apass-opensdk-hugong-1.0.0.tgz#ef2d0a19e793358784cb764de4b885fd86befd66"
|
|
17
|
+
integrity sha512-Q8Gpo9v8a/2G43y/Lh2POyDEOcealFuUlGdqGSA9wyfjET4+LWs/PnzK9EB1YZCjQotW7cGO/9a0MiQ6Sgw1LA==
|
|
18
|
+
====== 找到这一行 =====
|
|
19
|
+
|
|
20
|
+
将版本改为最新的版本号后,然后保存,重写部署即可使用NPM源最新的版本
|
|
21
|
+
修改后的yarn.lock文件如下, 一共三处地方:
|
|
22
|
+
apass-opensdk-hugong@1.0.3:
|
|
23
|
+
version "1.0.3"
|
|
24
|
+
resolved "https://registry.npmmirror.com/apass-opensdk-hugong/-/apass-opensdk-hugong-1.0.3.tgz#ef2d0a19e793358784cb764de4b885fd86befd66"
|
|
25
|
+
integrity sha512-Q8Gpo9v8a/2G43y/Lh2POyDEOcealFuUlGdqGSA9wyfjET4+LWs/PnzK9EB1YZCjQotW7cGO/9a0MiQ6Sgw1LA==
|
|
11
26
|
```
|
|
12
27
|
|
|
13
28
|
## 如何使用
|
|
14
29
|
```
|
|
15
30
|
const Hugong = require('apass-opensdk-hugong');
|
|
31
|
+
初始化
|
|
16
32
|
const hg = new Hugong(logger)
|
|
17
|
-
|
|
18
|
-
do something
|
|
19
33
|
```
|
|
20
34
|
## 常用
|
|
21
35
|
```
|
|
@@ -23,18 +37,42 @@ do something
|
|
|
23
37
|
hg.newTime()
|
|
24
38
|
hg.printTime()
|
|
25
39
|
|
|
26
|
-
线程睡眠
|
|
40
|
+
线程睡眠(毫秒)
|
|
27
41
|
await hg.sleep(2000)
|
|
28
42
|
|
|
29
43
|
支持将数组分割成指定长度分段数组
|
|
30
|
-
第一种用法,一次性返还分割后的数组
|
|
31
|
-
const list = hg.utils.splitArray([], 50)
|
|
44
|
+
第一种用法,一次性返还分割后的数组
|
|
45
|
+
const list = hg.utils.splitArray([], 50) 输出 [ [50],[50] ]
|
|
32
46
|
|
|
33
47
|
第二种用法,每次输出50条 处理完成后继续下次执行
|
|
34
48
|
await hg.utils.splitArray([], 10, async (items)=>{
|
|
35
49
|
// do something
|
|
36
50
|
})
|
|
37
51
|
|
|
52
|
+
```
|
|
53
|
+
## 文件上传/下载
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
1)从网络下载文件后上传到飞书租户空间,返回上传后的文件信息
|
|
57
|
+
await hg.utils.file.downloadFileToUpload(url)
|
|
58
|
+
2)如果有鉴权, 可以传递header参数
|
|
59
|
+
await hg.utils.file.downloadFileToUpload(url,{ Authorization: `...`})
|
|
60
|
+
3)保存数据到本地环境中,比如接口返回的数据需要保存到本地环境中方便查看
|
|
61
|
+
saveDataToEnv(data,path)
|
|
62
|
+
|
|
63
|
+
1)从飞书租户空间下载文件到本地环境中
|
|
64
|
+
file_info={ id, mime_type, name, ...}
|
|
65
|
+
file_path=存储地址可选,不填写则默认当前时间戳
|
|
66
|
+
await hg.utils.file.downloadFileToTmp(fileInfo,file_path)
|
|
67
|
+
|
|
68
|
+
2)解析csv文件,file_path必须是本地环境的文件路径 /tep/aaa.csv 可以使用上面的方法downloadFileToTmp下载文件到本地环境中
|
|
69
|
+
await hg.utils.file.csvRead(file_path,callback)
|
|
70
|
+
示例1 读取完成后返回数组
|
|
71
|
+
const list = await hg.utils.file.csvRead(file_path)
|
|
72
|
+
示例2 读取完成后回调
|
|
73
|
+
await hg.utils.file.csvRead(file_path,async (row)=>{
|
|
74
|
+
// do something
|
|
75
|
+
})
|
|
38
76
|
```
|
|
39
77
|
|
|
40
78
|
## 小工具/多语言
|
|
@@ -46,13 +84,8 @@ await hg.utils.splitArray([], 10, async (items)=>{
|
|
|
46
84
|
hg.toMultilingual([{ lang: 'en-US', value: 'Regular' },{ lang: 'zh-CN', value: '正式' }]) 常用于开放平台返回的多语言数据转换
|
|
47
85
|
hg.toMultilingual(zh,en)
|
|
48
86
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
* @param {*} obj
|
|
52
|
-
* @param {*} key
|
|
53
|
-
* @param {*} defValue 默认值
|
|
54
|
-
*/
|
|
55
|
-
toSafeValue(obj,key,defValue)
|
|
87
|
+
安全的取值
|
|
88
|
+
hg.toSafeValue(obj={},key,defValue)
|
|
56
89
|
|
|
57
90
|
```
|
|
58
91
|
|
package/utils/file_.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
class File_{
|
|
3
|
+
#hg = null
|
|
4
|
+
#logger = null
|
|
5
|
+
constructor(logger,hg){
|
|
6
|
+
this.#logger = logger
|
|
7
|
+
this.#hg = hg
|
|
8
|
+
}
|
|
9
|
+
getCurrentTimeFolderName() {
|
|
10
|
+
const now = new Date();
|
|
11
|
+
const year = now.getFullYear();
|
|
12
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
13
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
14
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
15
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
16
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
17
|
+
return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* * 网络下载文件并上传到租户空间
|
|
21
|
+
* @param {*} url 网络文件地址
|
|
22
|
+
* @param {*} header 可选
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
25
|
+
async downloadFileToUpload(url, header = {}){
|
|
26
|
+
this.#logger.log(`download url=${url}`)
|
|
27
|
+
const resp = await axios({ url, method: 'get', responseType: 'stream', headers: {...header} });
|
|
28
|
+
// 上传文件获取文件 token
|
|
29
|
+
const file_info = await application.resources.file.upload(resp.data);
|
|
30
|
+
this.#logger.log('file_info',file_info)
|
|
31
|
+
return file_info
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 下载租户空间的文件到环境tmp目录中
|
|
35
|
+
* @param {*} file_info { id, mime_type, name, ...}
|
|
36
|
+
* @param {*} file_path 存储地址可选,不填写则默认当前时间戳
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
async downloadFileToTmp(file_info, file_path){
|
|
40
|
+
this.#logger.log(`download input=${ JSON.stringify(file_info)}`)
|
|
41
|
+
const _file_path = file_path || `/tmp/${Date.now()}.${ file_info.mime_type }`
|
|
42
|
+
await application.resources.file.download({id: file_info.id}, _file_path);
|
|
43
|
+
this.#logger.log(`download success, path=` + _file_path)
|
|
44
|
+
return _file_path
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 写入文件
|
|
48
|
+
* @param {*} data 写入的内容
|
|
49
|
+
* @param {*} fileName 存储地址
|
|
50
|
+
*/
|
|
51
|
+
saveDataToEnv(data,fileName){
|
|
52
|
+
fs.writeFileSync(fileName || `${ Date.now() }.txt`,data, { flag: 'a' })
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 读取Excel文件(需要安装依赖:csv-parser)
|
|
56
|
+
* @param {*} path
|
|
57
|
+
* @param {*} callback(row) 每一行的回调
|
|
58
|
+
* @returns callback为null时,返回全部读取的结果list
|
|
59
|
+
*/
|
|
60
|
+
async csvRead(path,callback) {
|
|
61
|
+
const csv = require('csv-parser');
|
|
62
|
+
return await new Promise((resolve, reject) => {
|
|
63
|
+
const list = []
|
|
64
|
+
fs.createReadStream(path).pipe(csv())
|
|
65
|
+
.on('data', (row) => {
|
|
66
|
+
if(callback){
|
|
67
|
+
callback(row)
|
|
68
|
+
}else{
|
|
69
|
+
list.push(row)
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
.on('end', () => {
|
|
73
|
+
resolve(list)
|
|
74
|
+
})
|
|
75
|
+
.on('error',()=>{
|
|
76
|
+
reject()
|
|
77
|
+
});
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
module.exports = File_
|
package/utils/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const Url = require('./url')
|
|
2
|
+
const File_ = require('./file_')
|
|
2
3
|
class Utils{
|
|
3
4
|
#hg = null
|
|
4
5
|
#logger = null
|
|
@@ -7,6 +8,7 @@ class Utils{
|
|
|
7
8
|
this.#hg = hg
|
|
8
9
|
|
|
9
10
|
this.url = new Url(logger,hg)
|
|
11
|
+
this.file = new File_(logger,hg)
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
/**
|
|
@@ -29,5 +31,11 @@ class Utils{
|
|
|
29
31
|
return result;
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
32
40
|
}
|
|
33
41
|
module.exports = Utils
|