@netang/quasar 0.1.93 → 0.1.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/.editorconfig +12 -12
  2. package/_docs/docs/components/field-table.md +58 -58
  3. package/_docs/docs/components/field-tree.md +21 -21
  4. package/_docs/docs/components/table.md +24 -24
  5. package/_docs/docs/utils/table.md +196 -196
  6. package/components/column-title/index.vue +38 -38
  7. package/components/dialog/img-viewer/index.vue +657 -657
  8. package/components/dialog/index.vue +373 -373
  9. package/components/drawer/index.vue +303 -303
  10. package/components/editor-code/index.vue +325 -325
  11. package/components/empty/index.vue +80 -80
  12. package/components/field-date/index.vue +850 -850
  13. package/components/field-tree/index.vue +754 -754
  14. package/components/img/index.vue +239 -239
  15. package/components/input-number/index.vue +547 -547
  16. package/components/mixed-table/index.vue +532 -532
  17. package/components/mixed-table-splitter/index.vue +377 -377
  18. package/components/power-page/index.vue +94 -94
  19. package/components/private/components/move-to-tree/index.vue +154 -154
  20. package/components/private/edit-power-data/index.vue +846 -846
  21. package/components/private/table-visible-columns-button/index.vue +114 -114
  22. package/components/render/index.vue +123 -123
  23. package/components/search/index.vue +231 -231
  24. package/components/search-item/index.vue +212 -212
  25. package/components/select/index.vue +177 -177
  26. package/components/splitter/index.vue +422 -422
  27. package/components/table/index.vue +513 -513
  28. package/components/table-column-fixed/index.vue +110 -110
  29. package/components/table-summary/index.vue +107 -107
  30. package/components/toolbar/index.vue +146 -146
  31. package/components/tree/index.vue +1728 -1728
  32. package/components/uploader/index.vue +190 -190
  33. package/components/uploader-query/index.vue +893 -893
  34. package/docs/404.html +33 -33
  35. package/docs/assets/404.html-60b35caa.js +1 -1
  36. package/docs/assets/404.html-d1e63d77.js +1 -1
  37. package/docs/assets/alert.html-b2a2a72f.js +5 -5
  38. package/docs/assets/alert.html-ba46d137.js +1 -1
  39. package/docs/assets/app-9f30aa4b.js +6 -6
  40. package/docs/assets/area.html-01b9b58d.js +42 -42
  41. package/docs/assets/area.html-9a4fce6a.js +1 -1
  42. package/docs/assets/arr.html-145d27e7.js +1 -1
  43. package/docs/assets/arr.html-674e65ab.js +11 -11
  44. package/docs/assets/auth.html-579fa830.js +1 -1
  45. package/docs/assets/auth.html-8544ed95.js +8 -8
  46. package/docs/assets/bus.html-c71254aa.js +1 -1
  47. package/docs/assets/bus.html-dc7d3d19.js +6 -6
  48. package/docs/assets/column-title.html-c735cb5a.js +3 -3
  49. package/docs/assets/column-title.html-e9316762.js +1 -1
  50. package/docs/assets/confirm.html-ddfdc27f.js +10 -10
  51. package/docs/assets/confirm.html-ef3e2bef.js +1 -1
  52. package/docs/assets/copy.html-d20345b6.js +1 -1
  53. package/docs/assets/copy.html-ef8c8571.js +13 -13
  54. package/docs/assets/data.html-6432175d.js +30 -30
  55. package/docs/assets/data.html-a3b05d5b.js +1 -1
  56. package/docs/assets/dialog.html-1f698e5a.js +1 -1
  57. package/docs/assets/dialog.html-62902b83.js +68 -68
  58. package/docs/assets/dialog.html-baea77c9.js +1 -1
  59. package/docs/assets/dialog.html-bb082fc4.js +1 -1
  60. package/docs/assets/dict.html-1311da3d.js +23 -23
  61. package/docs/assets/dict.html-b96fbf0c.js +1 -1
  62. package/docs/assets/dictOptions.html-7c4f40a5.js +1 -1
  63. package/docs/assets/dictOptions.html-fb99d175.js +5 -5
  64. package/docs/assets/dragger.html-668d3efa.js +1 -1
  65. package/docs/assets/dragger.html-749d585a.js +1 -1
  66. package/docs/assets/editor-code.html-6ab26ea9.js +1 -1
  67. package/docs/assets/editor-code.html-d196205d.js +1 -1
  68. package/docs/assets/empty.html-1c139131.js +1 -1
  69. package/docs/assets/empty.html-1e9c441d.js +1 -1
  70. package/docs/assets/field-date.html-069fdb13.js +1 -1
  71. package/docs/assets/field-date.html-ad204aa9.js +1 -1
  72. package/docs/assets/field-table.html-ce480f03.js +1 -1
  73. package/docs/assets/field-table.html-d9236160.js +1 -1
  74. package/docs/assets/field-text.html-7277c62f.js +1 -1
  75. package/docs/assets/field-text.html-ccb4cecf.js +1 -1
  76. package/docs/assets/field-tree.html-519bfb45.js +1 -1
  77. package/docs/assets/field-tree.html-fdc748d6.js +1 -1
  78. package/docs/assets/form.html-2b562c37.js +2 -2
  79. package/docs/assets/form.html-75104cd5.js +1 -1
  80. package/docs/assets/framework-204010b2.js +5 -5
  81. package/docs/assets/getData.html-990e3787.js +1 -1
  82. package/docs/assets/getData.html-bb72025f.js +34 -34
  83. package/docs/assets/getFile.html-42368004.js +1 -1
  84. package/docs/assets/getFile.html-99abd054.js +3 -3
  85. package/docs/assets/getImage.html-3429c5a1.js +1 -1
  86. package/docs/assets/getImage.html-4d886d83.js +3 -3
  87. package/docs/assets/getTime.html-7435f922.js +1 -1
  88. package/docs/assets/getTime.html-b37f49eb.js +20 -20
  89. package/docs/assets/img.html-7d1da657.js +1 -1
  90. package/docs/assets/img.html-fbea1105.js +1 -1
  91. package/docs/assets/index.html-1695dd7c.js +1 -1
  92. package/docs/assets/index.html-65a4aa67.js +1 -1
  93. package/docs/assets/index.html-7b98d5bd.js +1 -1
  94. package/docs/assets/index.html-c01f2648.js +1 -1
  95. package/docs/assets/input-number.html-0b250d2a.js +1 -1
  96. package/docs/assets/input-number.html-a8eb0378.js +1 -1
  97. package/docs/assets/list-menu-item.html-7f1b4611.js +1 -1
  98. package/docs/assets/list-menu-item.html-84ed5ab8.js +1 -1
  99. package/docs/assets/list-menu.html-28b4163f.js +1 -1
  100. package/docs/assets/list-menu.html-cb6ba95b.js +1 -1
  101. package/docs/assets/loading.html-dae9e39d.js +6 -6
  102. package/docs/assets/loading.html-dc74c9e6.js +1 -1
  103. package/docs/assets/notify.html-e6c4c514.js +1 -1
  104. package/docs/assets/notify.html-f2c4d914.js +8 -8
  105. package/docs/assets/power-page.html-32e02f82.js +1 -1
  106. package/docs/assets/power-page.html-485e77da.js +1 -1
  107. package/docs/assets/power.html-d258cc19.js +93 -93
  108. package/docs/assets/power.html-e490bd32.js +1 -1
  109. package/docs/assets/previewImage.html-6a6b4245.js +1 -1
  110. package/docs/assets/previewImage.html-c5b7e945.js +2 -2
  111. package/docs/assets/price.html-1882c548.js +19 -19
  112. package/docs/assets/price.html-94d3f5be.js +1 -1
  113. package/docs/assets/price.html-d213df0f.js +1 -1
  114. package/docs/assets/price.html-deaf880f.js +1 -1
  115. package/docs/assets/render.html-8efcbdd4.js +1 -1
  116. package/docs/assets/render.html-df228e38.js +1 -1
  117. package/docs/assets/rule.html-2cd57fc2.js +13 -13
  118. package/docs/assets/rule.html-61662001.js +1 -1
  119. package/docs/assets/ruleValid.html-04fe2552.js +1 -1
  120. package/docs/assets/ruleValid.html-e0a776af.js +14 -14
  121. package/docs/assets/search-0782d0d1.svg +1 -1
  122. package/docs/assets/search-item.html-3f75394c.js +1 -1
  123. package/docs/assets/search-item.html-4e942ecd.js +1 -1
  124. package/docs/assets/search.html-2807043e.js +1 -1
  125. package/docs/assets/search.html-c24f8806.js +1 -1
  126. package/docs/assets/select.html-00d0607c.js +1 -1
  127. package/docs/assets/select.html-de7731f5.js +1 -1
  128. package/docs/assets/splitter.html-56f51a70.js +1 -1
  129. package/docs/assets/splitter.html-f5c836d7.js +1 -1
  130. package/docs/assets/style-161e43ab.css +1 -1
  131. package/docs/assets/symbols.html-a6aea4bf.js +1 -1
  132. package/docs/assets/symbols.html-b1f65bad.js +21 -21
  133. package/docs/assets/table-column-fixed.html-3a69e7b2.js +1 -1
  134. package/docs/assets/table-column-fixed.html-e763c38b.js +1 -1
  135. package/docs/assets/table-pagination.html-236934d3.js +1 -1
  136. package/docs/assets/table-pagination.html-c37ee2ac.js +1 -1
  137. package/docs/assets/table-splitter.html-07eab15c.js +1 -1
  138. package/docs/assets/table-splitter.html-7670ee65.js +1 -1
  139. package/docs/assets/table-summary.html-04db434f.js +1 -1
  140. package/docs/assets/table-summary.html-943c65a0.js +1 -1
  141. package/docs/assets/table.html-36253ad7.js +1 -1
  142. package/docs/assets/table.html-7f9c5d1b.js +38 -38
  143. package/docs/assets/table.html-93d53dc8.js +1 -1
  144. package/docs/assets/table.html-ac99b9cb.js +1 -1
  145. package/docs/assets/thumbnail.html-bab1976b.js +1 -1
  146. package/docs/assets/thumbnail.html-eb64e5e8.js +1 -1
  147. package/docs/assets/timestamp.html-4e54f79b.js +13 -13
  148. package/docs/assets/timestamp.html-d0e1b88a.js +1 -1
  149. package/docs/assets/toast.html-58ecbe21.js +1 -1
  150. package/docs/assets/toast.html-c9b9d36b.js +6 -6
  151. package/docs/assets/toolbar.html-83d9f97c.js +1 -1
  152. package/docs/assets/toolbar.html-ff7b8c92.js +1 -1
  153. package/docs/assets/tree.html-d07cbe79.js +23 -23
  154. package/docs/assets/tree.html-ea04193e.js +1 -1
  155. package/docs/assets/uploader-query.html-05590718.js +1 -1
  156. package/docs/assets/uploader-query.html-3175bac5.js +1 -1
  157. package/docs/assets/uploader.html-36da4394.js +2 -2
  158. package/docs/assets/uploader.html-6b5f3079.js +1 -1
  159. package/docs/assets/uploader.html-b9340b57.js +1 -1
  160. package/docs/assets/uploader.html-bc1c22e3.js +1 -1
  161. package/docs/assets/value-format.html-8ae3d47d.js +1 -1
  162. package/docs/assets/value-format.html-afa99b3d.js +1 -1
  163. package/docs/components/column-title.html +35 -35
  164. package/docs/components/data.html +62 -62
  165. package/docs/components/dialog.html +33 -33
  166. package/docs/components/dragger.html +33 -33
  167. package/docs/components/editor-code.html +33 -33
  168. package/docs/components/empty.html +33 -33
  169. package/docs/components/field-date.html +33 -33
  170. package/docs/components/field-table.html +33 -33
  171. package/docs/components/field-text.html +33 -33
  172. package/docs/components/field-tree.html +33 -33
  173. package/docs/components/img.html +33 -33
  174. package/docs/components/input-number.html +33 -33
  175. package/docs/components/list-menu-item.html +33 -33
  176. package/docs/components/list-menu.html +33 -33
  177. package/docs/components/power-page.html +33 -33
  178. package/docs/components/price.html +33 -33
  179. package/docs/components/render.html +33 -33
  180. package/docs/components/search-item.html +33 -33
  181. package/docs/components/search.html +33 -33
  182. package/docs/components/select.html +33 -33
  183. package/docs/components/splitter.html +33 -33
  184. package/docs/components/table-column-fixed.html +33 -33
  185. package/docs/components/table-pagination.html +33 -33
  186. package/docs/components/table-splitter.html +33 -33
  187. package/docs/components/table-summary.html +33 -33
  188. package/docs/components/table.html +33 -33
  189. package/docs/components/thumbnail.html +33 -33
  190. package/docs/components/toolbar.html +33 -33
  191. package/docs/components/uploader-query.html +33 -33
  192. package/docs/components/uploader.html +33 -33
  193. package/docs/components/value-format.html +33 -33
  194. package/docs/index.html +33 -33
  195. package/docs/utils/alert.html +37 -37
  196. package/docs/utils/area.html +74 -74
  197. package/docs/utils/arr.html +43 -43
  198. package/docs/utils/auth.html +40 -40
  199. package/docs/utils/bus.html +38 -38
  200. package/docs/utils/confirm.html +42 -42
  201. package/docs/utils/copy.html +45 -45
  202. package/docs/utils/dialog.html +100 -100
  203. package/docs/utils/dict.html +55 -55
  204. package/docs/utils/dictOptions.html +37 -37
  205. package/docs/utils/form.html +34 -34
  206. package/docs/utils/getData.html +66 -66
  207. package/docs/utils/getFile.html +35 -35
  208. package/docs/utils/getImage.html +35 -35
  209. package/docs/utils/getTime.html +52 -52
  210. package/docs/utils/index.html +33 -33
  211. package/docs/utils/loading.html +38 -38
  212. package/docs/utils/notify.html +40 -40
  213. package/docs/utils/power.html +125 -125
  214. package/docs/utils/previewImage.html +34 -34
  215. package/docs/utils/price.html +51 -51
  216. package/docs/utils/rule.html +45 -45
  217. package/docs/utils/ruleValid.html +46 -46
  218. package/docs/utils/symbols.html +53 -53
  219. package/docs/utils/table.html +70 -70
  220. package/docs/utils/timestamp.html +45 -45
  221. package/docs/utils/toast.html +38 -38
  222. package/docs/utils/tree.html +55 -55
  223. package/docs/utils/uploader.html +34 -34
  224. package/package.json +1 -1
  225. package/sass/common.scss +184 -184
  226. package/sass/index.scss +12 -12
  227. package/sass/quasar/field.scss +250 -250
  228. package/sass/quasar/table.scss +168 -168
  229. package/sass/variables.scss +140 -140
  230. package/utils/$form.js +72 -72
  231. package/utils/$power.js +1460 -1435
  232. package/utils/$render.js +75 -75
  233. package/utils/$search.js +416 -416
  234. package/utils/$table.js +1275 -1275
  235. package/utils/config.js +57 -57
  236. package/utils/dialog.js +36 -36
  237. package/utils/dict.js +21 -21
  238. package/utils/getData.js +88 -88
  239. package/utils/getFile.js +41 -41
  240. package/utils/getImage.js +176 -176
  241. package/utils/getTime.js +113 -113
  242. package/utils/index.js +65 -65
  243. package/utils/previewImage.js +14 -14
  244. package/utils/timestamp.js +18 -18
  245. package/utils/uploader/qiniu.js +326 -320
  246. package/utils/uploader.js +1625 -1625
  247. package/utils/useFileUrl.js +25 -25
  248. package/utils/useSearch.js +499 -499
@@ -1,320 +1,326 @@
1
- import $n_has from 'lodash/has'
2
- import $n_isString from 'lodash/isString'
3
- import $n_findIndex from 'lodash/findIndex'
4
- import $n_trim from 'lodash/trim'
5
-
6
- import $n_isValidObject from '@netang/utils/isValidObject'
7
- import $n_isValidString from '@netang/utils/isValidString'
8
- import $n_http from '@netang/utils/http'
9
-
10
- import $n_toast from '../toast'
11
- import $n_config from '../config'
12
-
13
- import {
14
- UPLOAD_STATUS,
15
- } from '../useUploader'
16
-
17
- /**
18
- * 获取七牛云上传 token
19
- */
20
- async function getQiniuToken(bucket = 'public') {
21
-
22
- // 请求数据
23
- const { status, data } = await $n_http({
24
- url: $n_config('apiFileUrl') + 'get_qiniu_token',
25
- data: {
26
- bucket,
27
- },
28
-
29
- // 【生产模式】
30
- // --------------------------------------------------
31
- // #ifdef IS_PRO
32
- // 开启缓存
33
- cache: 'qiniu_token_' + bucket,
34
- // 缓存时间(6 小时)
35
- cacheTime: 21600000,
36
- // #endif
37
- // --------------------------------------------------
38
- })
39
-
40
- // 如果成功
41
- if (! status) {
42
- return false
43
- }
44
-
45
- return data
46
- }
47
-
48
- /**
49
- * 七牛云上传
50
- */
51
- export default async function ({ waitUploadFileLists, uploadFileLists, checkFileError, setFileSuccess, setFileFail }) {
52
-
53
- // 获取七牛云上传 token
54
- const token = await getQiniuToken()
55
- if (! token) {
56
- for (const fileItem of waitUploadFileLists) {
57
- setFileFail(fileItem, '上传失败')
58
- }
59
- $n_toast({
60
- message: '获取上传参数失败',
61
- })
62
- return
63
- }
64
-
65
- // 批量上传
66
- for (const fileItem of waitUploadFileLists) {
67
- // 上传单个文件
68
- await uploadFileItem(fileItem, token)
69
- }
70
-
71
- /**
72
- * 上传单个文件
73
- */
74
- async function uploadFileItem(fileItem, token) {
75
-
76
- // 设置文件状态
77
- fileItem.status = UPLOAD_STATUS.uploading
78
-
79
- // 请求上传文件到七牛云
80
- const { status, data: resUpload } = await $n_http({
81
- // 上传地址
82
- url: 'https://upload.qiniup.com/',
83
- // 数据
84
- data: {
85
- // 七牛云上传 token
86
- token,
87
- // 文件
88
- file: fileItem.file,
89
- // 自定义文件 key
90
- key: fileItem.hash,
91
- },
92
- // 关闭错误提醒
93
- warn: false,
94
- // 关闭检查结果 code
95
- checkCode: false,
96
- // 不包含头部鉴权认证
97
- token: false,
98
- // 开启上传
99
- upload: true,
100
- // 取消请求
101
- onCancel(cancel) {
102
- // 设置中断上传
103
- fileItem.abort = function(msg) {
104
- cancel($n_isValidString(msg) ? msg : '已取消')
105
- }
106
- },
107
- // 监听上传进度
108
- onUploadProgress(percent) {
109
- // 设置上传进度
110
- fileItem.progress = percent
111
- },
112
- })
113
-
114
- // 如果请求失败
115
- if (! status) {
116
- // 设置文件上传失败
117
- setFileFail(fileItem, resUpload.msg)
118
- return
119
- }
120
-
121
- // 如果检查七牛回调成功
122
- const query = await checkQiniuCallback(resUpload, fileItem)
123
- if (! query) {
124
- return
125
- }
126
-
127
- // 请求 - 上传文件至 cdn
128
- const { status: statusCallback, data: resCallback } = await $n_http({
129
- url: $n_config('apiFileUrl') + 'upload_cdn_callback',
130
- data: query,
131
- // 关闭错误提示
132
- warn: false,
133
- })
134
-
135
- // 请求失败
136
- if (! statusCallback) {
137
- // 设置文件上传失败
138
- setFileFail(fileItem, resCallback.msg || '上传失败')
139
- return
140
- }
141
-
142
- // 设置文件上传成功
143
- setFileSuccess(fileItem)
144
- }
145
-
146
- /**
147
- * 检查七牛回调成功
148
- */
149
- function checkQiniuCallback(res, fileItem) {
150
-
151
- // 如果文件被删除
152
- if ($n_findIndex(uploadFileLists.value, { hash: fileItem.hash }) === -1) {
153
- // 设置文件上传失败
154
- setFileFail(fileItem, '上传失败')
155
- return false
156
- }
157
-
158
- // 返回示例
159
- // ------------------------------
160
- // format: "null"
161
- // width: null
162
- // height: null
163
- // key: "d038dce5892840636b2c1f6d241f33ad"
164
- // hash: "lrYGlELBAgN9OgKV_i5gbHOdZMvt"
165
- // orientation: null
166
- // size: 6620454
167
- // aduration: 57.258005
168
- // vwidth: 1280
169
- // vheight: 720
170
- // vrotate: null
171
- // vduration: 57.291992
172
-
173
- const {
174
- format,
175
- width,
176
- height,
177
- key,
178
- orientation,
179
- size,
180
- aduration,
181
- vwidth,
182
- vheight,
183
- vrotate,
184
- vduration,
185
- } = res
186
-
187
- const query = {
188
- // 标题
189
- title: fileItem.title,
190
- // 类型(1:文件,2:图片,3:视频,4:音频)
191
- type: 0,
192
- // hash
193
- hash: key,
194
- // 文件大小
195
- size,
196
- // 后缀
197
- ext: fileItem.ext,
198
- }
199
-
200
- // json 信息
201
- const json = {}
202
-
203
- // 【1】先判断是否为视频(有时长 && 有宽 && 有高 && 时长 > 0, 则为视频)
204
- if (vduration && vwidth && vheight) {
205
-
206
- // 类型(3:视频)
207
- query.type = 3
208
-
209
- // 视频旋转角度
210
- // vrotate: 无 ==> 1: 手机右横屏(宽高不变)
211
- // vrotate: 90 ==> 2: 手机垂直(宽高反转)
212
- // vrotate: 180 ==> 3: 手机左横屏(宽高不变)
213
- // vrotate: 270 ==> 4: 手机倒过来垂直(宽高反转)
214
- const rotates = {
215
- 90: 2,
216
- 180: 3,
217
- 270: 4,
218
- }
219
-
220
- // 设置 json 信息
221
- Object.assign(json, {
222
- w: vwidth,
223
- h: vheight,
224
- d: vduration,
225
- })
226
-
227
- if ($n_has(rotates, vrotate)) {
228
- json.o = rotates[vrotate]
229
- }
230
-
231
- // 【2】再判断是否为音频(有音频时长 && 无视频时长 && 音频时长 > 0, 则为音频)
232
- } else if (aduration && ! vduration) {
233
-
234
- // 类型(4:音频)
235
- query.type = 4
236
-
237
- // 设置 json 信息
238
- json.d = aduration
239
-
240
- // 【3】再判断是否为图片(有宽 && 有高 && 大小 < 20M, 为图片)
241
- } else if (width && height) {
242
-
243
- // 类型(2:图片)
244
- query.type = 2
245
-
246
- // 图片后缀名
247
- query.ext = format === 'jpeg' ? 'jpg' : format
248
-
249
- // 如果大小 < 20M, 则为可用图片
250
- if (size < 20971520) {
251
-
252
- // 设置 json 数据
253
- json.w = width
254
- json.h = height
255
-
256
- // 图片垂直角度
257
- const orientations = {
258
- // 【1】相机原始位置(宽高不变)
259
- // 'top-left': 1,
260
- // 【2】等于 1 的垂直镜像(几乎无用)(宽高不变)
261
- 'top-right': 2,
262
- // 【3】旋转 180度(宽高不变)
263
- 'bottom-right': 3,
264
- // 【4】等于 3 的垂直镜像(几乎无用)(宽高不变)
265
- 'bottom-left': 4,
266
- // 【5】等于 8 的水平镜像(几乎无用)(宽高反转)
267
- 'left-top': 5,
268
- // 【6】旋转 90 度(宽高反转)
269
- 'right-top': 6,
270
- // 【7】等于 8 的垂直镜像(几乎无用)(宽高反转)
271
- 'right-bottom': 7,
272
- // 【8】旋转 270 度(宽高反转)
273
- 'left-bottom': 8,
274
- }
275
- if (orientation && $n_isString(orientation)) {
276
- const key = $n_trim(orientation).toLowerCase()
277
- if ($n_has(orientations, key)) {
278
- json.o = orientations[key]
279
- }
280
- }
281
-
282
- // 否则为类型为文件
283
- } else {
284
- // 检查文件错误
285
- const errMsg = checkFileError(query)
286
- if (errMsg) {
287
- // 设置文件上传失败
288
- setFileFail(fileItem, errMsg)
289
- return false
290
- }
291
-
292
- // 类型(1:文件)
293
- query.type = 1
294
- }
295
-
296
- // 否则为类型为文件
297
- } else {
298
- // 类型(1:文件)
299
- query.type = 1
300
- }
301
-
302
- // 检查文件错误
303
- const errMsg = checkFileError(query)
304
- if (errMsg) {
305
- // 设置文件上传失败
306
- setFileFail(fileItem, errMsg)
307
- return false
308
- }
309
-
310
- // json 信息
311
- query.json = json
312
-
313
- // 设置文件
314
- Object.assign(fileItem, query)
315
-
316
- return Object.assign({}, query, {
317
- json: $n_isValidObject(json) ? JSON.stringify(json) : ''
318
- })
319
- }
320
- }
1
+ import $n_has from 'lodash/has'
2
+ import $n_isString from 'lodash/isString'
3
+ import $n_findIndex from 'lodash/findIndex'
4
+ import $n_trim from 'lodash/trim'
5
+
6
+ import $n_isValidObject from '@netang/utils/isValidObject'
7
+ import $n_isValidString from '@netang/utils/isValidString'
8
+ import $n_http from '@netang/utils/http'
9
+ import $n_trimString from '@netang/utils/trimString'
10
+
11
+ import $n_toast from '../toast'
12
+ import $n_config from '../config'
13
+
14
+ import {
15
+ UPLOAD_STATUS,
16
+ } from '../useUploader'
17
+
18
+ /**
19
+ * 获取七牛云上传 token
20
+ */
21
+ async function getQiniuToken(bucket = 'public') {
22
+
23
+ // 请求数据
24
+ const { status, data } = await $n_http({
25
+ url: $n_config('apiFileUrl') + 'get_qiniu_token',
26
+ data: {
27
+ bucket,
28
+ },
29
+
30
+ // 【生产模式】
31
+ // --------------------------------------------------
32
+ // #ifdef IS_PRO
33
+ // 开启缓存
34
+ cache: 'qiniu_token_' + bucket,
35
+ // 缓存时间(6 小时)
36
+ cacheTime: 21600000,
37
+ // #endif
38
+ // --------------------------------------------------
39
+ })
40
+
41
+ // 如果成功
42
+ if (! status) {
43
+ return false
44
+ }
45
+
46
+ return data
47
+ }
48
+
49
+ /**
50
+ * 七牛云上传
51
+ */
52
+ export default async function ({ waitUploadFileLists, uploadFileLists, checkFileError, setFileSuccess, setFileFail }) {
53
+
54
+ // 获取七牛云上传 token
55
+ const token = await getQiniuToken()
56
+ if (! token) {
57
+ for (const fileItem of waitUploadFileLists) {
58
+ setFileFail(fileItem, '上传失败')
59
+ }
60
+ $n_toast({
61
+ message: '获取上传参数失败',
62
+ })
63
+ return
64
+ }
65
+
66
+ // 批量上传
67
+ for (const fileItem of waitUploadFileLists) {
68
+ // 上传单个文件
69
+ await uploadFileItem(fileItem, token)
70
+ }
71
+
72
+ /**
73
+ * 上传单个文件
74
+ */
75
+ async function uploadFileItem(fileItem, token) {
76
+
77
+ // 设置文件状态
78
+ fileItem.status = UPLOAD_STATUS.uploading
79
+
80
+ // 请求上传文件到七牛云
81
+ const { status, data: resUpload } = await $n_http({
82
+ // 上传地址
83
+ url: 'https://upload.qiniup.com/',
84
+ // 数据
85
+ data: {
86
+ // 七牛云上传 token
87
+ token,
88
+ // 文件
89
+ file: fileItem.file,
90
+ // 自定义文件 key
91
+ key: fileItem.hash,
92
+ },
93
+ // 关闭错误提醒
94
+ warn: false,
95
+ // 关闭检查结果 code
96
+ checkCode: false,
97
+ // 不包含头部鉴权认证
98
+ token: false,
99
+ // 开启上传
100
+ upload: true,
101
+ // 取消请求
102
+ onCancel(cancel) {
103
+ // 设置中断上传
104
+ fileItem.abort = function(msg) {
105
+ cancel($n_isValidString(msg) ? msg : '已取消')
106
+ }
107
+ },
108
+ // 监听上传进度
109
+ onUploadProgress(percent) {
110
+ // 设置上传进度
111
+ fileItem.progress = percent
112
+ },
113
+ })
114
+
115
+ // 如果请求失败
116
+ if (! status) {
117
+ // 设置文件上传失败
118
+ setFileFail(fileItem, resUpload.msg)
119
+ return
120
+ }
121
+
122
+ // 如果检查七牛回调成功
123
+ const query = await checkQiniuCallback(resUpload, fileItem)
124
+ if (! query) {
125
+ return
126
+ }
127
+
128
+ // 请求 - 上传文件至 cdn
129
+ const { status: statusCallback, data: resCallback } = await $n_http({
130
+ url: $n_config('apiFileUrl') + 'upload_cdn_callback',
131
+ data: query,
132
+ // 关闭错误提示
133
+ warn: false,
134
+ })
135
+
136
+ // 请求失败
137
+ if (! statusCallback) {
138
+ // 设置文件上传失败
139
+ setFileFail(fileItem, resCallback.msg || '上传失败')
140
+ return
141
+ }
142
+
143
+ // 设置文件上传成功
144
+ setFileSuccess(fileItem)
145
+ }
146
+
147
+ /**
148
+ * 检查七牛回调成功
149
+ */
150
+ function checkQiniuCallback(res, fileItem) {
151
+
152
+ // 如果文件被删除
153
+ if ($n_findIndex(uploadFileLists.value, { hash: fileItem.hash }) === -1) {
154
+ // 设置文件上传失败
155
+ setFileFail(fileItem, '上传失败')
156
+ return false
157
+ }
158
+
159
+ // 返回示例
160
+ // ------------------------------
161
+ // format: "null"
162
+ // width: null
163
+ // height: null
164
+ // key: "d038dce5892840636b2c1f6d241f33ad"
165
+ // hash: "lrYGlELBAgN9OgKV_i5gbHOdZMvt"
166
+ // orientation: null
167
+ // size: 6620454
168
+ // aduration: 57.258005
169
+ // vwidth: 1280
170
+ // vheight: 720
171
+ // vrotate: null
172
+ // vduration: 57.291992
173
+
174
+ let {
175
+ format,
176
+ width,
177
+ height,
178
+ key,
179
+ orientation,
180
+ size,
181
+ aduration,
182
+ vwidth,
183
+ vheight,
184
+ vrotate,
185
+ vduration,
186
+ } = res
187
+
188
+ format = $n_trimString(format)
189
+ if (format) {
190
+ format = format.toLowerCase()
191
+ }
192
+
193
+ const query = {
194
+ // 标题
195
+ title: fileItem.title,
196
+ // 类型(1:文件,2:图片,3:视频,4:音频)
197
+ type: 0,
198
+ // hash
199
+ hash: key,
200
+ // 文件大小
201
+ size,
202
+ // 后缀
203
+ ext: fileItem.ext,
204
+ }
205
+
206
+ // json 信息
207
+ const json = {}
208
+
209
+ // 【1】先判断是否为视频(有时长 && 有宽 && 有高 && 时长 > 0, 则为视频)
210
+ if (vduration && vwidth && vheight) {
211
+
212
+ // 类型(3:视频)
213
+ query.type = 3
214
+
215
+ // 视频旋转角度
216
+ // vrotate: 无 ==> 1: 手机右横屏(宽高不变)
217
+ // vrotate: 90 ==> 2: 手机垂直(宽高反转)
218
+ // vrotate: 180 ==> 3: 手机左横屏(宽高不变)
219
+ // vrotate: 270 ==> 4: 手机倒过来垂直(宽高反转)
220
+ const rotates = {
221
+ 90: 2,
222
+ 180: 3,
223
+ 270: 4,
224
+ }
225
+
226
+ // 设置 json 信息
227
+ Object.assign(json, {
228
+ w: vwidth,
229
+ h: vheight,
230
+ d: vduration,
231
+ })
232
+
233
+ if ($n_has(rotates, vrotate)) {
234
+ json.o = rotates[vrotate]
235
+ }
236
+
237
+ // 【2】再判断是否为音频(有音频时长 && 无视频时长 && 音频时长 > 0, 则为音频)
238
+ } else if (aduration && ! vduration) {
239
+
240
+ // 类型(4:音频)
241
+ query.type = 4
242
+
243
+ // 设置 json 信息
244
+ json.d = aduration
245
+
246
+ // 【3】再判断是否为图片(有宽 && 有高 && 大小 < 20M, 为图片)
247
+ } else if (width && height) {
248
+
249
+ // 类型(2:图片)
250
+ query.type = 2
251
+
252
+ // 图片后缀名
253
+ query.ext = format === 'png' || format === 'gif' ? format : 'jpg'
254
+
255
+ // 如果大小 < 20M, 则为可用图片
256
+ if (size < 20971520) {
257
+
258
+ // 设置 json 数据
259
+ json.w = width
260
+ json.h = height
261
+
262
+ // 图片垂直角度
263
+ const orientations = {
264
+ // 【1】相机原始位置(宽高不变)
265
+ // 'top-left': 1,
266
+ // 【2】等于 1 的垂直镜像(几乎无用)(宽高不变)
267
+ 'top-right': 2,
268
+ // 【3】旋转 180度(宽高不变)
269
+ 'bottom-right': 3,
270
+ // 【4】等于 3 的垂直镜像(几乎无用)(宽高不变)
271
+ 'bottom-left': 4,
272
+ // 【5】等于 8 的水平镜像(几乎无用)(宽高反转)
273
+ 'left-top': 5,
274
+ // 【6】旋转 90 度(宽高反转)
275
+ 'right-top': 6,
276
+ // 【7】等于 8 的垂直镜像(几乎无用)(宽高反转)
277
+ 'right-bottom': 7,
278
+ // 【8】旋转 270 度(宽高反转)
279
+ 'left-bottom': 8,
280
+ }
281
+ if (orientation && $n_isString(orientation)) {
282
+ const key = $n_trim(orientation).toLowerCase()
283
+ if ($n_has(orientations, key)) {
284
+ json.o = orientations[key]
285
+ }
286
+ }
287
+
288
+ // 否则为类型为文件
289
+ } else {
290
+ // 检查文件错误
291
+ const errMsg = checkFileError(query)
292
+ if (errMsg) {
293
+ // 设置文件上传失败
294
+ setFileFail(fileItem, errMsg)
295
+ return false
296
+ }
297
+
298
+ // 类型(1:文件)
299
+ query.type = 1
300
+ }
301
+
302
+ // 否则为类型为文件
303
+ } else {
304
+ // 类型(1:文件)
305
+ query.type = 1
306
+ }
307
+
308
+ // 检查文件错误
309
+ const errMsg = checkFileError(query)
310
+ if (errMsg) {
311
+ // 设置文件上传失败
312
+ setFileFail(fileItem, errMsg)
313
+ return false
314
+ }
315
+
316
+ // json 信息
317
+ query.json = json
318
+
319
+ // 设置文件
320
+ Object.assign(fileItem, query)
321
+
322
+ return Object.assign({}, query, {
323
+ json: $n_isValidObject(json) ? JSON.stringify(json) : ''
324
+ })
325
+ }
326
+ }