cnhis-design-vue 2.1.56 → 2.1.58

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 (574) hide show
  1. package/.prettierrc.js +27 -27
  2. package/CHANGELOG.md +2653 -2551
  3. package/README.md +90 -90
  4. package/commitlint.config.js +1 -1
  5. package/es/affix/index.js +8 -8
  6. package/es/age/index.js +18 -18
  7. package/es/alert/index.js +8 -8
  8. package/es/anchor/index.js +8 -8
  9. package/es/auto-complete/index.js +8 -8
  10. package/es/avatar/index.js +8 -8
  11. package/es/back-top/index.js +8 -8
  12. package/es/badge/index.js +8 -8
  13. package/es/base/index.js +8 -8
  14. package/es/big-table/index.js +308 -308
  15. package/es/breadcrumb/index.js +8 -8
  16. package/es/button/index.js +31 -31
  17. package/es/calendar/index.js +8 -8
  18. package/es/captcha/index.js +7 -7
  19. package/es/card/index.js +8 -8
  20. package/es/carousel/index.js +8 -8
  21. package/es/cascader/index.js +8 -8
  22. package/es/checkbox/index.js +17 -17
  23. package/es/col/index.js +8 -8
  24. package/es/collapse/index.js +8 -8
  25. package/es/color-picker/index.js +5 -5
  26. package/es/comment/index.js +8 -8
  27. package/es/config-provider/index.js +8 -8
  28. package/es/date-picker/index.js +30 -30
  29. package/es/descriptions/index.js +8 -8
  30. package/es/divider/index.js +8 -8
  31. package/es/drag-layout/index.js +5 -5
  32. package/es/drawer/index.js +8 -8
  33. package/es/dropdown/index.js +8 -8
  34. package/es/editor/index.js +1 -1
  35. package/es/ellipsis/index.js +3211 -0
  36. package/es/ellipsis/style.css +1 -0
  37. package/es/empty/index.js +8 -8
  38. package/es/fabric-chart/index.js +45 -45
  39. package/es/form/index.js +8 -8
  40. package/es/form-model/index.js +8 -8
  41. package/es/form-table/index.js +1623 -422
  42. package/es/form-table/style.css +1 -1
  43. package/es/grid/index.js +4 -4
  44. package/es/index/index.js +2599 -1411
  45. package/es/index/style.css +1 -1
  46. package/es/input/index.js +11 -11
  47. package/es/input-number/index.js +8 -8
  48. package/es/keep-cache/index.js +9 -9
  49. package/es/layout/index.js +8 -8
  50. package/es/list/index.js +8 -8
  51. package/es/locale-provider/index.js +8 -8
  52. package/es/map/index.js +13 -13
  53. package/es/mentions/index.js +8 -8
  54. package/es/menu/index.js +8 -8
  55. package/es/message/index.js +8 -8
  56. package/es/multi-chat/index.js +116 -116
  57. package/es/multi-chat-client/index.js +110 -110
  58. package/es/multi-chat-history/index.js +6 -6
  59. package/es/multi-chat-record/index.js +27 -27
  60. package/es/multi-chat-setting/index.js +43 -43
  61. package/es/multi-chat-sip/index.js +1 -1
  62. package/es/notification/index.js +8 -8
  63. package/es/page-header/index.js +8 -8
  64. package/es/pagination/index.js +8 -8
  65. package/es/popconfirm/index.js +8 -8
  66. package/es/popover/index.js +8 -8
  67. package/es/progress/index.js +8 -8
  68. package/es/radio/index.js +17 -17
  69. package/es/rate/index.js +8 -8
  70. package/es/result/index.js +8 -8
  71. package/es/row/index.js +8 -8
  72. package/es/scale-container/index.js +3361 -0
  73. package/es/scale-container/style.css +1 -0
  74. package/es/scale-view/index.js +158 -158
  75. package/es/select/index.js +83 -70
  76. package/es/select/style.css +1 -1
  77. package/es/select-label/index.js +50 -50
  78. package/es/select-person/index.js +20 -20
  79. package/es/shortcut-setter/index.js +10 -10
  80. package/es/skeleton/index.js +8 -8
  81. package/es/slider/index.js +8 -8
  82. package/es/space/index.js +8 -8
  83. package/es/spin/index.js +8 -8
  84. package/es/statistic/index.js +8 -8
  85. package/es/steps/index.js +8 -8
  86. package/es/switch/index.js +8 -8
  87. package/es/table-filter/index.js +251 -238
  88. package/es/table-filter/style.css +1 -1
  89. package/es/tabs/index.js +8 -8
  90. package/es/tag/index.js +9 -9
  91. package/es/time-picker/index.js +8 -8
  92. package/es/timeline/index.js +8 -8
  93. package/es/tooltip/index.js +8 -8
  94. package/es/transfer/index.js +8 -8
  95. package/es/tree/index.js +8 -8
  96. package/es/tree-select/index.js +8 -8
  97. package/es/upload/index.js +8 -8
  98. package/es/utils/clickoutside.js +7 -7
  99. package/es/utils/kty.min-1.0.0.js +5 -5
  100. package/es/utils/time-domain.js +16 -16
  101. package/es/utils/utils-map.js +32 -32
  102. package/es/utils/vexutils.js +27 -27
  103. package/es/verification-code/index.js +2 -2
  104. package/lib/cui.common.js +5011 -1618
  105. package/lib/cui.umd.js +5011 -1618
  106. package/lib/cui.umd.min.js +63 -57
  107. package/package.json +110 -108
  108. package/packages/affix/index.js +12 -12
  109. package/packages/affix/src/Affix.jsx +12 -12
  110. package/packages/age/index.js +27 -27
  111. package/packages/age/src/age/index.vue +139 -139
  112. package/packages/age/src/age-com/index.vue +209 -209
  113. package/packages/alert/index.js +12 -12
  114. package/packages/alert/src/Alert.jsx +11 -11
  115. package/packages/anchor/index.js +18 -18
  116. package/packages/anchor/src/Anchor.jsx +11 -11
  117. package/packages/anchor/src/Link.jsx +11 -11
  118. package/packages/auto-complete/index.js +12 -12
  119. package/packages/auto-complete/src/AutoComplete.jsx +12 -12
  120. package/packages/avatar/index.js +12 -12
  121. package/packages/avatar/src/Avatar.jsx +11 -11
  122. package/packages/back-top/index.js +12 -12
  123. package/packages/back-top/src/BackTop.jsx +11 -11
  124. package/packages/badge/index.js +12 -12
  125. package/packages/badge/src/Badge.jsx +11 -11
  126. package/packages/base/index.js +3 -3
  127. package/packages/big-table/index.js +16 -16
  128. package/packages/big-table/src/BigTable.vue +3144 -3144
  129. package/packages/big-table/src/Fieldset.vue +2067 -2067
  130. package/packages/big-table/src/assets/iconfont/iconfont.css +21 -21
  131. package/packages/big-table/src/assets/style/table-base.less +385 -385
  132. package/packages/big-table/src/assets/style/table-global.less +175 -175
  133. package/packages/big-table/src/components/AutoLayoutButton.vue +279 -279
  134. package/packages/big-table/src/components/NoData.vue +81 -81
  135. package/packages/big-table/src/components/TextOverTooltip.vue +120 -120
  136. package/packages/big-table/src/components/edit-form/EditForm.vue +509 -509
  137. package/packages/big-table/src/components/edit-form/edit-component/config-data/index.js +68 -68
  138. package/packages/big-table/src/components/edit-form/edit-component/edit-date-picker/edit-date-picker.vue +60 -60
  139. package/packages/big-table/src/components/edit-form/edit-component/edit-digital/edit-digital.vue +54 -54
  140. package/packages/big-table/src/components/edit-form/edit-component/edit-input/edit-input.vue +39 -39
  141. package/packages/big-table/src/components/edit-form/edit-component/edit-input-password/edit-input-password.vue +79 -79
  142. package/packages/big-table/src/components/edit-form/edit-component/edit-month-picker/edit-month-picker.vue +37 -37
  143. package/packages/big-table/src/components/edit-form/edit-component/edit-search/edit-search.vue +82 -82
  144. package/packages/big-table/src/components/edit-form/edit-component/edit-search-more/edit-search-more.vue +95 -95
  145. package/packages/big-table/src/components/edit-form/edit-component/edit-select/edit-select.vue +40 -40
  146. package/packages/big-table/src/components/edit-form/edit-component/edit-select-multiple/edit-select-multiple.vue +55 -55
  147. package/packages/big-table/src/components/edit-form/edit-component/edit-switch/edit-switch.vue +43 -43
  148. package/packages/big-table/src/components/edit-form/edit-component/edit-textarea/edit-textarea.vue +41 -41
  149. package/packages/big-table/src/components/edit-form/edit-component/edit-time-picker/edit-time-picker.vue +40 -40
  150. package/packages/big-table/src/components/edit-form/edit-component/mixins/bound-date.js +3 -3
  151. package/packages/big-table/src/components/edit-form/edit-component/mixins/dateType.js +217 -217
  152. package/packages/big-table/src/components/edit-form/edit-component/mixins/item-default.js +639 -639
  153. package/packages/big-table/src/components/edit-form/edit-component/mixins/search.js +1247 -1247
  154. package/packages/big-table/src/components/edit-form/edit-component/register-com.js +26 -26
  155. package/packages/big-table/src/components/edit-form/edit-item/form-event.js +80 -80
  156. package/packages/big-table/src/components/edit-form/edit-item/global-props.js +33 -33
  157. package/packages/big-table/src/components/edit-form/edit-item/index.js +4 -4
  158. package/packages/big-table/src/components/edit-form/edit-item/render-methods.js +28 -28
  159. package/packages/big-table/src/components/edit-form/edit-item/validate-rules.js +463 -463
  160. package/packages/big-table/src/components/edit-form/edit-mixins/form-commom.js +673 -673
  161. package/packages/big-table/src/components/edit-form/edit-mixins/index.js +3 -3
  162. package/packages/big-table/src/components/edit-form/edit-utils/index.js +112 -112
  163. package/packages/big-table/src/components/password-com.vue +58 -58
  164. package/packages/big-table/src/components/player-vod/index.vue +57 -57
  165. package/packages/big-table/src/components/player-vod/player.vue +189 -189
  166. package/packages/big-table/src/components/player-vod/video-list.vue +265 -265
  167. package/packages/big-table/src/components/player-vod/video-modal.vue +126 -126
  168. package/packages/big-table/src/utils/CustomPagination.vue +86 -86
  169. package/packages/big-table/src/utils/batchEditing.js +610 -610
  170. package/packages/big-table/src/utils/bigTableProps.js +103 -103
  171. package/packages/big-table/src/utils/format.js +557 -557
  172. package/packages/big-table/src/utils/nestTable.js +109 -109
  173. package/packages/big-table/src/utils/tableParse.js +234 -234
  174. package/packages/breadcrumb/index.js +21 -21
  175. package/packages/breadcrumb/src/Breadcrumb.jsx +11 -11
  176. package/packages/breadcrumb/src/BreadcrumbItem.jsx +11 -11
  177. package/packages/breadcrumb/src/BreadcrumbSeparator.jsx +11 -11
  178. package/packages/button/index.js +21 -21
  179. package/packages/button/src/Button.jsx +11 -11
  180. package/packages/button/src/ButtonGroup.jsx +11 -11
  181. package/packages/button/src/ButtonPrint/components/IdentityVerification.vue +181 -181
  182. package/packages/button/src/ButtonPrint/index.vue +766 -766
  183. package/packages/button/src/ButtonPrint/mixin/his-print.js +95 -95
  184. package/packages/calendar/index.js +12 -12
  185. package/packages/calendar/src/Calendar.jsx +11 -11
  186. package/packages/captcha/index.js +9 -9
  187. package/packages/captcha/src/Captcha.vue +164 -164
  188. package/packages/captcha/src/Index.vue +47 -47
  189. package/packages/captcha/src/SlideVerify.vue +285 -285
  190. package/packages/card/index.js +21 -21
  191. package/packages/card/src/Card.jsx +12 -12
  192. package/packages/card/src/CardGrid.js +7 -7
  193. package/packages/card/src/CardMeta.js +7 -7
  194. package/packages/carousel/index.js +12 -12
  195. package/packages/carousel/src/Carousel.jsx +12 -12
  196. package/packages/cascader/index.js +12 -12
  197. package/packages/cascader/src/Cascader.jsx +11 -11
  198. package/packages/checkbox/index.js +30 -30
  199. package/packages/checkbox/src/Checkbox.jsx +11 -11
  200. package/packages/checkbox/src/CheckboxImg/index.vue +141 -141
  201. package/packages/checkbox/src/Group.jsx +11 -11
  202. package/packages/col/index.js +13 -13
  203. package/packages/col/src/Col.jsx +11 -11
  204. package/packages/collapse/index.js +18 -18
  205. package/packages/collapse/src/Collapse.jsx +11 -11
  206. package/packages/collapse/src/Panel.jsx +11 -11
  207. package/packages/color-picker/index.js +10 -10
  208. package/packages/color-picker/src/color-picker.vue +191 -191
  209. package/packages/color-picker/src/style.less +109 -109
  210. package/packages/comment/index.js +12 -12
  211. package/packages/comment/src/Comment.jsx +11 -11
  212. package/packages/config-provider/index.js +12 -12
  213. package/packages/config-provider/src/ConfigProvider.jsx +11 -11
  214. package/packages/date-picker/index.js +26 -26
  215. package/packages/date-picker/src/DatePicker.jsx +12 -12
  216. package/packages/date-picker/src/MonthPicker.jsx +11 -11
  217. package/packages/date-picker/src/RangePicker.jsx +11 -11
  218. package/packages/date-picker/src/WeekPicker.jsx +11 -11
  219. package/packages/date-picker/src/utils/index.js +374 -374
  220. package/packages/descriptions/index.js +18 -18
  221. package/packages/descriptions/src/Descriptions.jsx +11 -11
  222. package/packages/descriptions/src/Item.jsx +11 -11
  223. package/packages/divider/index.js +12 -12
  224. package/packages/divider/src/Divider.jsx +11 -11
  225. package/packages/drag-layout/DragFormLeftItem.vue +173 -173
  226. package/packages/drag-layout/DragFormRightItem.vue +284 -284
  227. package/packages/drag-layout/I18n-mixins.js +10 -10
  228. package/packages/drag-layout/drag-layout.vue +778 -778
  229. package/packages/drag-layout/index.js +12 -12
  230. package/packages/drawer/index.js +12 -12
  231. package/packages/drawer/src/Drawer.jsx +11 -11
  232. package/packages/dropdown/index.js +12 -12
  233. package/packages/dropdown/src/Dropdown.jsx +11 -11
  234. package/packages/editor/index.js +9 -9
  235. package/packages/ellipsis/index.js +9 -0
  236. package/packages/ellipsis/src/Ellipsis.vue +65 -0
  237. package/packages/empty/index.js +12 -12
  238. package/packages/empty/src/Empty.jsx +11 -11
  239. package/packages/fabric-chart/index.js +9 -9
  240. package/packages/fabric-chart/src/FabricGrid.vue +66 -66
  241. package/packages/fabric-chart/src/components/DropPopup.vue +90 -90
  242. package/packages/fabric-chart/src/components/MouseRightClick.vue +168 -168
  243. package/packages/fabric-chart/src/components/TimeScaleValue.vue +115 -115
  244. package/packages/fabric-chart/src/const/defaultVaule.js +59 -59
  245. package/packages/fabric-chart/src/fabric-chart/FabricLines.vue +552 -552
  246. package/packages/fabric-chart/src/fabric-chart/FabricPolylines.vue +1126 -1126
  247. package/packages/fabric-chart/src/fabric-chart/FabricScaleValue.vue +134 -134
  248. package/packages/fabric-chart/src/fabric-chart/FabricTextGroup.vue +566 -566
  249. package/packages/fabric-chart/src/mixins/fabricCommon.js +95 -95
  250. package/packages/fabric-chart/src/mixins/fabricObject.js +193 -193
  251. package/packages/fabric-chart/src/mixins/type.js +5 -5
  252. package/packages/form/index.js +16 -16
  253. package/packages/form/src/Form.jsx +11 -11
  254. package/packages/form/src/Item.jsx +11 -11
  255. package/packages/form-model/index.js +14 -14
  256. package/packages/form-model/src/FormModel.jsx +11 -11
  257. package/packages/form-model/src/Item.jsx +11 -11
  258. package/packages/form-table/index.js +16 -10
  259. package/packages/form-table/src/FormTable.vue +1110 -1110
  260. package/packages/form-table/src/components/table-component/config-data/index.js +80 -80
  261. package/packages/form-table/src/components/table-component/global-props.js +22 -22
  262. package/packages/form-table/src/components/table-component/index.js +8 -8
  263. package/packages/form-table/src/components/table-component/mixins/bound-date.js +455 -455
  264. package/packages/form-table/src/components/table-component/mixins/dateType.js +217 -217
  265. package/packages/form-table/src/components/table-component/mixins/item-default.js +257 -257
  266. package/packages/form-table/src/components/table-component/mixins/search.js +1242 -1228
  267. package/packages/form-table/src/components/table-component/register-com.js +30 -30
  268. package/packages/form-table/src/components/table-component/table-age/table-age.vue +175 -175
  269. package/packages/form-table/src/components/table-component/table-date-picker/table-date-picker.vue +87 -87
  270. package/packages/form-table/src/components/table-component/table-digital/table-digital.vue +93 -93
  271. package/packages/form-table/src/components/table-component/table-input/table-input.vue +81 -81
  272. package/packages/form-table/src/components/table-component/table-input-password/table-input-password.vue +126 -126
  273. package/packages/form-table/src/components/table-component/table-month-picker/table-month-picker.vue +55 -55
  274. package/packages/form-table/src/components/table-component/table-search/table-search.vue +174 -128
  275. package/packages/form-table/src/components/table-component/table-search-more/table-search-more.vue +191 -144
  276. package/packages/form-table/src/components/table-component/table-select/table-select.vue +64 -64
  277. package/packages/form-table/src/components/table-component/table-select-multiple/table-select-multiple.vue +81 -81
  278. package/packages/form-table/src/components/table-component/table-textarea/table-textarea.vue +76 -76
  279. package/packages/form-table/src/components/table-component/table-time-picker/table-time-picker.vue +55 -55
  280. package/packages/form-table/src/components/table-component/table-tree-select/table-tree-select.vue +135 -135
  281. package/packages/form-table/src/components/table-component/text-over-tooltip/TextOverTooltip.vue +97 -97
  282. package/packages/form-table/src/components/table-item/form-event.js +81 -81
  283. package/packages/form-table/src/components/table-item/global-props.js +27 -27
  284. package/packages/form-table/src/components/table-item/index.js +4 -4
  285. package/packages/form-table/src/components/table-item/render-methods.js +28 -28
  286. package/packages/form-table/src/components/table-item/validate-rules.js +520 -520
  287. package/packages/form-table/src/components/table-mixins/form-commom.js +98 -98
  288. package/packages/form-table/src/components/table-mixins/index.js +3 -3
  289. package/packages/form-table/src/components/table-utils/index.js +112 -112
  290. package/packages/form-table/src/disabledDetail.less +46 -46
  291. package/packages/grid/index.js +10 -10
  292. package/packages/grid/src/grid.js +28 -28
  293. package/packages/icon/index.js +10 -10
  294. package/packages/icon/src/icon.js +13 -13
  295. package/packages/index.js +313 -307
  296. package/packages/input/index.js +30 -30
  297. package/packages/input/src/Group.jsx +11 -11
  298. package/packages/input/src/Input.jsx +11 -11
  299. package/packages/input/src/Password.jsx +11 -11
  300. package/packages/input/src/Search.jsx +11 -11
  301. package/packages/input/src/TextArea.jsx +11 -11
  302. package/packages/input/src/input-quick/components/quick-item.vue +284 -284
  303. package/packages/input/src/input-quick/components/quick-popover.vue +596 -596
  304. package/packages/input/src/input-quick/index.vue +137 -137
  305. package/packages/input-number/index.js +12 -12
  306. package/packages/input-number/src/InputNumber.jsx +11 -11
  307. package/packages/keep-cache/KeepCache.js +236 -236
  308. package/packages/keep-cache/index.css +2 -2
  309. package/packages/keep-cache/index.js +8 -8
  310. package/packages/layout/index.js +27 -27
  311. package/packages/layout/src/Content.jsx +11 -11
  312. package/packages/layout/src/Footer.jsx +11 -11
  313. package/packages/layout/src/Header.jsx +11 -11
  314. package/packages/layout/src/Layout.jsx +11 -11
  315. package/packages/layout/src/Sider.jsx +11 -11
  316. package/packages/list/index.js +21 -21
  317. package/packages/list/src/Item.jsx +11 -11
  318. package/packages/list/src/ItemMeta.jsx +11 -11
  319. package/packages/list/src/List.jsx +11 -11
  320. package/packages/locale-provider/index.js +12 -12
  321. package/packages/locale-provider/src/LocaleProvider.jsx +11 -11
  322. package/packages/map/index.js +9 -9
  323. package/packages/map/src/Map.vue +484 -484
  324. package/packages/map/src/popup-map.vue +53 -53
  325. package/packages/mentions/index.js +18 -18
  326. package/packages/mentions/src/Mentions.jsx +11 -11
  327. package/packages/mentions/src/Option.jsx +11 -11
  328. package/packages/menu/index.js +27 -27
  329. package/packages/menu/src/Divider.jsx +11 -11
  330. package/packages/menu/src/Item.jsx +11 -11
  331. package/packages/menu/src/ItemGroup.jsx +11 -11
  332. package/packages/menu/src/Menu.jsx +11 -11
  333. package/packages/menu/src/SubMenu.jsx +11 -11
  334. package/packages/message/index.js +8 -8
  335. package/packages/modal/index.js +10 -10
  336. package/packages/modal/src/Modal.js +7 -7
  337. package/packages/multi-chat/chat/addConference.vue +200 -200
  338. package/packages/multi-chat/chat/addMembers.vue +411 -411
  339. package/packages/multi-chat/chat/advancedFilter.vue +372 -372
  340. package/packages/multi-chat/chat/calling.vue +246 -246
  341. package/packages/multi-chat/chat/chatFooter.vue +1596 -1596
  342. package/packages/multi-chat/chat/chatHistory.vue +605 -605
  343. package/packages/multi-chat/chat/chatMain.vue +1486 -1486
  344. package/packages/multi-chat/chat/client/index.vue +149 -149
  345. package/packages/multi-chat/chat/delay.vue +177 -177
  346. package/packages/multi-chat/chat/evaluate.vue +343 -343
  347. package/packages/multi-chat/chat/messageRecord.vue +324 -324
  348. package/packages/multi-chat/chat/mixins/NoData.js +20 -20
  349. package/packages/multi-chat/chat/mixins/base.js +97 -97
  350. package/packages/multi-chat/chat/mixins/uniRTCAPI.js +80 -80
  351. package/packages/multi-chat/chat/mixins/viewerOptions.js +67 -67
  352. package/packages/multi-chat/chat/quickReply.vue +439 -439
  353. package/packages/multi-chat/chat/robot/index.vue +312 -312
  354. package/packages/multi-chat/chat/scrollList.vue +1238 -1238
  355. package/packages/multi-chat/chat/videoVoiceList.vue +348 -348
  356. package/packages/multi-chat/chat/voice.vue +431 -431
  357. package/packages/multi-chat/components/avatar.vue +113 -113
  358. package/packages/multi-chat/components/chat-tabs-header.vue +251 -251
  359. package/packages/multi-chat/components/classify-tabs.vue +185 -185
  360. package/packages/multi-chat/components/empty.vue +24 -24
  361. package/packages/multi-chat/components/modal-refuse-reason.vue +112 -112
  362. package/packages/multi-chat/components/modal-sip.vue +160 -160
  363. package/packages/multi-chat/components/modal-user-transfer.vue +98 -98
  364. package/packages/multi-chat/components/msg-describe.vue +138 -138
  365. package/packages/multi-chat/components/msg-picture.vue +68 -68
  366. package/packages/multi-chat/components/msg-prescription.vue +205 -205
  367. package/packages/multi-chat/components/read-record.vue +133 -133
  368. package/packages/multi-chat/components/read-status.vue +34 -34
  369. package/packages/multi-chat/components/user-status.vue +198 -198
  370. package/packages/multi-chat/index.js +7 -7
  371. package/packages/multi-chat/setting/authority/index.vue +156 -156
  372. package/packages/multi-chat/setting/authority/roleSetting.vue +204 -204
  373. package/packages/multi-chat/setting/baseInfo/index.vue +1316 -1316
  374. package/packages/multi-chat/setting/customerService/batchSelect.vue +403 -403
  375. package/packages/multi-chat/setting/customerService/index.vue +273 -273
  376. package/packages/multi-chat/setting/event/edit/condition.vue +128 -128
  377. package/packages/multi-chat/setting/event/edit/index.vue +437 -437
  378. package/packages/multi-chat/setting/event/edit/notice.vue +129 -129
  379. package/packages/multi-chat/setting/event/edit/strategy.vue +98 -98
  380. package/packages/multi-chat/setting/event/index.vue +249 -249
  381. package/packages/multi-chat/setting/index.vue +269 -269
  382. package/packages/multi-chat/setting/page.vue +14 -14
  383. package/packages/multi-chat/setting/sessionList/index.vue +412 -412
  384. package/packages/multi-chat/setting/sessionList/messageRecord.vue +372 -372
  385. package/packages/multi-chat/setting/userConfig/index.vue +124 -124
  386. package/packages/multi-chat/setting/worktime/index.vue +274 -274
  387. package/packages/multi-chat/store/actions.js +452 -452
  388. package/packages/multi-chat/store/getters.js +371 -371
  389. package/packages/multi-chat/store/helper.js +66 -66
  390. package/packages/multi-chat/store/index.js +50 -50
  391. package/packages/multi-chat/store/mutation.js +296 -296
  392. package/packages/multi-chat/store/state.js +117 -117
  393. package/packages/multi-chat/style/emoji.css +315 -315
  394. package/packages/multi-chat/style/message.mixin.less +38 -38
  395. package/packages/multi-chat/utils/chatSock.js +93 -93
  396. package/packages/multi-chat/utils/compressImage.js +115 -115
  397. package/packages/multi-chat/utils/emoji.json +68 -68
  398. package/packages/multi-chat/utils/index.js +259 -259
  399. package/packages/multi-chat/utils/observer-scroll.js +49 -49
  400. package/packages/multi-chat/utils/panelsetting.js +48 -48
  401. package/packages/multi-chat-client/index.js +7 -7
  402. package/packages/multi-chat-history/index.js +7 -7
  403. package/packages/multi-chat-record/index.js +7 -7
  404. package/packages/multi-chat-setting/index.js +7 -7
  405. package/packages/multi-chat-sip/index.js +6 -6
  406. package/packages/notification/index.js +8 -8
  407. package/packages/page-header/index.js +12 -12
  408. package/packages/page-header/src/PageHeader.jsx +11 -11
  409. package/packages/pagination/index.js +12 -12
  410. package/packages/pagination/src/Pagination.jsx +11 -11
  411. package/packages/popconfirm/index.js +12 -12
  412. package/packages/popconfirm/src/Popconfirm.jsx +11 -11
  413. package/packages/popover/index.js +12 -12
  414. package/packages/popover/src/Popover.jsx +11 -11
  415. package/packages/progress/index.js +12 -12
  416. package/packages/progress/src/Progress.jsx +11 -11
  417. package/packages/radio/index.js +33 -33
  418. package/packages/radio/src/Group.jsx +11 -11
  419. package/packages/radio/src/Radio.jsx +11 -11
  420. package/packages/radio/src/RadioButton.jsx +11 -11
  421. package/packages/radio/src/RadioImg/index.vue +124 -124
  422. package/packages/rate/index.js +12 -12
  423. package/packages/rate/src/Rate.jsx +11 -11
  424. package/packages/result/index.js +12 -12
  425. package/packages/result/src/Result.jsx +11 -11
  426. package/packages/row/index.js +12 -12
  427. package/packages/row/src/Row.jsx +11 -11
  428. package/packages/scale-container/index.js +9 -0
  429. package/packages/scale-container/src/ScaleContainer.vue +197 -0
  430. package/packages/scale-container/src/scale.png +0 -0
  431. package/packages/scale-view/NoData.vue +81 -81
  432. package/packages/scale-view/answerParse.vue +133 -133
  433. package/packages/scale-view/customList.vue +801 -801
  434. package/packages/scale-view/data.js +80 -80
  435. package/packages/scale-view/evaluateCountdown.vue +155 -155
  436. package/packages/scale-view/evaluatePage.vue +202 -202
  437. package/packages/scale-view/formitem/data.js +3991 -3991
  438. package/packages/scale-view/formitem/index.js +6 -6
  439. package/packages/scale-view/formitem/r-address.vue +238 -238
  440. package/packages/scale-view/formitem/r-choice.vue +726 -726
  441. package/packages/scale-view/formitem/r-input.vue +92 -92
  442. package/packages/scale-view/formitem/r-prompt.vue +52 -52
  443. package/packages/scale-view/formitem/r-time.vue +285 -285
  444. package/packages/scale-view/formitem/r-upload-custom-list.vue +242 -242
  445. package/packages/scale-view/formitem/r-upload.vue +287 -287
  446. package/packages/scale-view/formitem/text-over-tooltip/TextOverTooltip.vue +98 -98
  447. package/packages/scale-view/index.js +17 -17
  448. package/packages/scale-view/mixin/NoData.js +38 -38
  449. package/packages/scale-view/mixin/evaluate.js +146 -146
  450. package/packages/scale-view/mixin/index.js +337 -337
  451. package/packages/scale-view/mixin/judgeTypes.js +267 -267
  452. package/packages/scale-view/scaleView.vue +2010 -2010
  453. package/packages/select/index.js +27 -27
  454. package/packages/select/src/CustomSelect/index.vue +130 -130
  455. package/packages/select/src/OptGroup.jsx +11 -11
  456. package/packages/select/src/Option.jsx +11 -11
  457. package/packages/select/src/Select/Select.vue +231 -231
  458. package/packages/select/src/Select/index.js +12 -12
  459. package/packages/select/src/TableSelect/index.vue +514 -514
  460. package/packages/select-label/index.js +14 -14
  461. package/packages/select-label/label-classify.vue +129 -129
  462. package/packages/select-label/labelFormContent.vue +787 -787
  463. package/packages/select-label/select-label.vue +581 -581
  464. package/packages/select-person/index.js +10 -10
  465. package/packages/select-person/search-tree.vue +373 -373
  466. package/packages/select-person/select-person.vue +1696 -1696
  467. package/packages/shortcut-setter/index.js +12 -12
  468. package/packages/shortcut-setter/src/ShortcutSetter.vue +55 -55
  469. package/packages/shortcut-setter/src/ShortcutSetterItem.vue +84 -84
  470. package/packages/shortcut-setter/src/utils/index.js +63 -63
  471. package/packages/skeleton/index.js +12 -12
  472. package/packages/skeleton/src/Skeleton.jsx +11 -11
  473. package/packages/slider/index.js +12 -12
  474. package/packages/slider/src/Slider.jsx +11 -11
  475. package/packages/space/index.js +12 -12
  476. package/packages/space/src/Space.jsx +11 -11
  477. package/packages/spin/index.js +12 -12
  478. package/packages/spin/src/Spin.jsx +11 -11
  479. package/packages/statistic/index.js +18 -18
  480. package/packages/statistic/src/Countdown.jsx +11 -11
  481. package/packages/statistic/src/Statistic.jsx +11 -11
  482. package/packages/steps/index.js +18 -18
  483. package/packages/steps/src/Step.jsx +11 -11
  484. package/packages/steps/src/Steps.jsx +11 -11
  485. package/packages/switch/index.js +12 -12
  486. package/packages/switch/src/Switch.jsx +11 -11
  487. package/packages/table-filter/index.js +27 -27
  488. package/packages/table-filter/src/base-search-com/BaseSearch.vue +2572 -2572
  489. package/packages/table-filter/src/classification/Classification-com.vue +1756 -1756
  490. package/packages/table-filter/src/classification/search-class-name.vue +266 -266
  491. package/packages/table-filter/src/classification/search-professional-model.vue +680 -680
  492. package/packages/table-filter/src/components/TextOverTooltip.vue +107 -107
  493. package/packages/table-filter/src/components/age-com/index.vue +205 -205
  494. package/packages/table-filter/src/components/button-group/ButtonGroup.vue +162 -162
  495. package/packages/table-filter/src/components/button-icon/button-icon.js +33 -33
  496. package/packages/table-filter/src/components/button-icon/getBtnIcon.js +34 -34
  497. package/packages/table-filter/src/components/c-tree-select/tree-select.vue +336 -336
  498. package/packages/table-filter/src/components/drop-button/drop-button.vue +224 -224
  499. package/packages/table-filter/src/components/drop-button/head-btn-icon.js +33 -33
  500. package/packages/table-filter/src/components/drop-view/drop-view.vue +89 -89
  501. package/packages/table-filter/src/components/multi-select/multi-select.vue +227 -227
  502. package/packages/table-filter/src/components/out-quick-search/out-quick-search.vue +340 -340
  503. package/packages/table-filter/src/components/range-age/index.vue +172 -172
  504. package/packages/table-filter/src/components/search-condition/SearchCondition.vue +1897 -1897
  505. package/packages/table-filter/src/components/search-condition/fieldTypeList.js +169 -169
  506. package/packages/table-filter/src/components/search-filter/SearchFilter.vue +278 -278
  507. package/packages/table-filter/src/components/search-modal/set-classification.vue +310 -310
  508. package/packages/table-filter/src/components/table-modal/TableModal.vue +463 -463
  509. package/packages/table-filter/src/const/dataOptions.js +43 -43
  510. package/packages/table-filter/src/const/index.js +1 -1
  511. package/packages/table-filter/src/index.vue +584 -584
  512. package/packages/table-filter/src/mixins/mixins.js +694 -694
  513. package/packages/table-filter/src/mixins/tableSearchCon.js +128 -128
  514. package/packages/table-filter/src/mixins/wordBookutils.js +102 -102
  515. package/packages/table-filter/src/quick-search/QuickSearch.vue +2125 -2125
  516. package/packages/tabs/index.js +18 -18
  517. package/packages/tabs/src/TabPane.jsx +11 -11
  518. package/packages/tabs/src/Tabs.jsx +11 -11
  519. package/packages/tag/index.js +21 -21
  520. package/packages/tag/src/CheckableTag.jsx +11 -11
  521. package/packages/tag/src/Tag.jsx +11 -11
  522. package/packages/tag/src/TagGroup.vue +621 -621
  523. package/packages/time-picker/index.js +12 -12
  524. package/packages/time-picker/src/TimePicker.jsx +11 -11
  525. package/packages/timeline/index.js +14 -14
  526. package/packages/timeline/src/Item.jsx +11 -11
  527. package/packages/timeline/src/Timeline.jsx +11 -11
  528. package/packages/tooltip/index.js +12 -12
  529. package/packages/tooltip/src/Tooltip.jsx +11 -11
  530. package/packages/transfer/index.js +12 -12
  531. package/packages/transfer/src/Transfer.jsx +11 -11
  532. package/packages/tree/index.js +18 -18
  533. package/packages/tree/src/Tree.jsx +11 -11
  534. package/packages/tree/src/TreeNode.jsx +11 -11
  535. package/packages/tree-select/index.js +18 -18
  536. package/packages/tree-select/src/TreeNode.jsx +11 -11
  537. package/packages/tree-select/src/TreeSelect.jsx +11 -11
  538. package/packages/upload/chunk-upload/chunk-upload-new.vue +1001 -1001
  539. package/packages/upload/chunk-upload/vod-chunk-upload.vue +749 -749
  540. package/packages/upload/chunk-upload/vod-upload-modal.vue +100 -100
  541. package/packages/upload/index.js +12 -12
  542. package/packages/upload/src/Upload.jsx +11 -11
  543. package/packages/verification-code/SlideVerify.vue +306 -306
  544. package/packages/verification-code/index.js +17 -17
  545. package/packages/verification-code/verification-code.vue +147 -147
  546. package/src/assets/img/nodata.png +0 -0
  547. package/src/component/player-vod/index.vue +57 -57
  548. package/src/component/player-vod/player.vue +188 -188
  549. package/src/component/player-vod/video-list.vue +262 -262
  550. package/src/component/player-vod/video-modal.vue +128 -128
  551. package/src/component/select-options/index.vue +430 -0
  552. package/src/component/select-pages/index.vue +95 -74
  553. package/src/component/svg/index.vue +59 -59
  554. package/src/core/create.js +6 -6
  555. package/src/core/event.js +23 -23
  556. package/src/core/table-methods.js +444 -444
  557. package/src/directive/flexibleResize.js +151 -151
  558. package/src/directive/preventReClick.js +12 -12
  559. package/src/directive/scroll.js +230 -230
  560. package/src/global/variable.js +2 -2
  561. package/src/style/normalize.css +424 -424
  562. package/src/style/style.less +49 -49
  563. package/src/utils/UniRTCv2.js +626 -626
  564. package/src/utils/chatFetch.js +61 -61
  565. package/src/utils/clickoutside.js +75 -75
  566. package/src/utils/crypto.js +25 -25
  567. package/src/utils/index.js +81 -81
  568. package/src/utils/kty-sdk.js +582 -582
  569. package/src/utils/kty.min-1.0.0.js +14378 -14378
  570. package/src/utils/sip-device.js +79 -79
  571. package/src/utils/time-domain.js +193 -193
  572. package/src/utils/trtc.js +1 -1
  573. package/src/utils/utils-map.js +484 -484
  574. package/src/utils/vexutils.js +836 -836
@@ -1,1001 +1,1001 @@
1
- <template>
2
- <div class="chunk-upload-container">
3
- <!-- 上传 -->
4
- <uploader
5
- ref="uploader"
6
- :options="options"
7
- :autoStart="autoStart"
8
- @file-added="onFileAdded"
9
- @file-success="onFileSuccess"
10
- @file-progress="onFileProgress"
11
- @file-error="onFileError"
12
- class="uploader-app"
13
- >
14
- <uploader-unsupport></uploader-unsupport>
15
-
16
- <uploader-drop>
17
- <div class="drap-container dragger-btn" @click="hanldeDraggerBtnClick">
18
- <a-icon type="folder-add" />
19
- <p>点击或将文件拖拽到这里上传</p>
20
- </div>
21
- </uploader-drop>
22
-
23
- <uploader-list>
24
- <div slot-scope="props" class="file-list-conatiner">
25
- <ul class="file-list">
26
- <li v-for="file in props.fileList" :key="file.id">
27
- <uploader-file :class="'file_' + file.id" ref="files" :file="file" :list="true">
28
- <div
29
- slot-scope="props"
30
- class="c-file-container"
31
- :class="{
32
- 'file-boder-bottom': ['complete', 'failed'].includes(
33
- getUploadShowStatus(file, 'status')
34
- )
35
- }"
36
- >
37
- <!-- icon -->
38
- <div class="c-f-item">
39
- <div class="c-f-item-icon">
40
- <a-icon type="paper-clip" style="color:#5585F5;" />
41
- </div>
42
- <div class="c-f-item-info">
43
- <!-- <a-spin
44
- :spinning="
45
- ['uploading', 'merging'].includes(getUploadShowStatus(file, 'status'))
46
- "
47
- > -->
48
- <div class="c-f-item-info-title">
49
- <span class="title">
50
- {{ file.name }}
51
- </span>
52
- <span class="size"> ({{ props.formatedSize }}) </span>
53
- </div>
54
- <div class="c-f-item-info-time">
55
- <span>
56
- {{ props.formatedTimeRemaining }}
57
- </span>
58
- <span>
59
- {{ getUploadShowStatus(file, "text") }}
60
- </span>
61
- </div>
62
- <!-- </a-spin> -->
63
-
64
- <!-- {{ props.progress }} -->
65
- </div>
66
- <div class="c-f-item-btn">
67
- <!-- <a-icon type="redo" @click="file.resume()" />
68
- <a-icon type="pause" @click="file.pause()" /> -->
69
- <a-icon type="close" @click="handleRemove(file)" />
70
-
71
- <!-- .pause() 暂停上窜文件。
72
- .resume() 继续上传文件。
73
- .cancel() 取消上传且从文件列表中移除。
74
- .retry() 重新上传文件。 -->
75
- </div>
76
- </div>
77
-
78
- <a-progress
79
- :percent="formatedProgress(props.progress, file)"
80
- :show-info="false"
81
- :strokeWidth="2"
82
- />
83
- </div>
84
- </uploader-file>
85
- </li>
86
- <!-- <div class="no-file" v-if="!props.fileList.length">
87
- <i class="iconfont icon-empty-file"></i> 暂无待上传文件
88
- </div> -->
89
- </ul>
90
- </div>
91
- </uploader-list>
92
-
93
- <div class="upload-btn">
94
- <uploader-btn v-show="false" :attrs="btnAttrs" ref="uploadBtn">
95
- <span>
96
- 上传新文件
97
- </span></uploader-btn
98
- >
99
- <a-button type="primary" class="mgl-10" @click="handleStartUpload">开始上传</a-button>
100
- </div>
101
- </uploader>
102
- </div>
103
- </template>
104
-
105
- <script>
106
- /**
107
- * getChunkUploadConfig()
108
- */
109
- import {
110
- Uploader,
111
- UploaderBtn,
112
- UploaderDrop,
113
- UploaderUnsupport,
114
- UploaderList,
115
- // UploaderFiles,
116
- UploaderFile
117
- } from "vue-simple-uploader";
118
- import SparkMD5 from "spark-md5";
119
- import axios, { CancelToken } from "axios";
120
- import {Progress,Button,Icon} from 'ant-design-vue'
121
- var instance = axios.create({});
122
- const chunkSize = 3 * 1024 * 1024;
123
- let count = 1;
124
- export default {
125
- name: "chunkUploadCom",
126
- props: {
127
- propsVisible: {
128
- type: Boolean,
129
- default: false
130
- },
131
- propsCategoryMap: {
132
- type: String,
133
- default: ""
134
- },
135
- max_size: {
136
- type: String,
137
- default: ""
138
- },
139
- maxLength: {
140
- type: Number,
141
- default: 0
142
- },
143
- defaultList: {
144
- type: Array,
145
- default: () => []
146
- },
147
- // 临时自测使用
148
- // uploadArguments: {
149
- // type: Object,
150
- // default: () => {
151
- // return {
152
- // type: "video"
153
- // };
154
- // }
155
- // },
156
-
157
- uploaderType: {
158
- type: String,
159
- default: "video"
160
- },
161
-
162
- getChunkUploadConfig:{
163
- type: Function,
164
- default: () => Promise.resolve({})
165
- }
166
- },
167
- data() {
168
- return {
169
- spinning: false,
170
- uploadConfig: {},
171
- options: {
172
- target: this.handleGetTargetUrl,
173
- chunkSize: chunkSize,
174
- fileParameterName: "file",
175
- maxChunkRetries: 3, // 上载失败之前,块的最大重试次数
176
- simultaneousUploads: 3, // 分片同时上传数
177
- prioritizeFirstAndLastChunk: true,
178
- forceChunkSize: true,
179
- testChunks: false, // 是否开启服务器分片校验
180
- // 服务器分片校验函数,秒传及断点续传基础
181
- // checkChunkUploadedByResponse: this.checkChunkUploadedByResponse,
182
- headers: this.handleProcessHeaders,
183
- query() {},
184
- processParams: this.handleProcessParams,
185
- parseTimeRemaining: this.parseTimeRemaining,
186
- processResponse: this.processResponse
187
- },
188
- attrs: {},
189
- collapse: false,
190
-
191
- configList: [],
192
- share: 1, // 是否共享 0私有 1共享
193
- baseUrl: "http://192.168.20.113:12060",
194
- headers: {
195
- Authorization: "bearer " + "d012a22a9f284801b1bed4c20f3715de"
196
- },
197
- withCredentials: false
198
- };
199
- },
200
- created() {
201
- this.init()
202
- },
203
- mounted() {},
204
- computed: {
205
- // Uploader实例
206
- uploader() {
207
- return this.$refs.uploader.uploader;
208
- },
209
- // 读取到文件自动上传
210
- autoStart() {
211
- return false;
212
- },
213
- visible: {
214
- get() {
215
- return this.propsVisible;
216
- }
217
- },
218
- btnAttrs() {
219
- return {
220
- accept: this.propsCategoryMap
221
- };
222
- },
223
-
224
- uploadArgumentsObj() {
225
- return { ...this.uploadArguments, share: this.share };
226
- },
227
-
228
- channel() {
229
- if (Object.keys(this.uploadConfig || {}).length === 0) {
230
- return undefined;
231
- }
232
- return this.uploaderType === "file"
233
- ? this.uploadConfig.fileChannel
234
- : this.uploadConfig.channel;
235
- },
236
-
237
- uploadArguments() {
238
- return {
239
- type: this.uploaderType,
240
- channel: this.channel
241
- };
242
- }
243
- },
244
- methods: {
245
- init(){
246
- try {
247
- this.getChunkUploadConfig().then(res => {
248
- this.uploadConfig = { ...res };
249
- this.headers = {
250
- Authorization: "bearer " + this.uploadConfig.token
251
- };
252
- this.setAxios();
253
- });
254
- } catch (error) {
255
- console.log(error)
256
- }
257
- },
258
- /** ----- uploader options config start ----- */
259
-
260
- /**
261
- * 上传参数转换
262
- */
263
- handleProcessParams(params, file) {
264
- let res = {
265
- channel: this.channel,
266
- md5: file.uniqueIdentifier,
267
- name: params.filename,
268
- chunk: params.chunkNumber - 1,
269
- chunks: params.totalChunks,
270
- chunkSize: params.currentChunkSize
271
- };
272
- count++;
273
- return res || params;
274
- },
275
-
276
- /**
277
- * 获取请求头
278
- */
279
- handleProcessHeaders() {
280
- return {
281
- Authorization: "bearer " + this.uploadConfig.token
282
- };
283
- },
284
-
285
- /**
286
- * 获取分片上传url
287
- */
288
- handleGetTargetUrl(file) {
289
- return this?.uploadConfig?.partFileUpload || "";
290
- },
291
-
292
- /**
293
- * 格式化上传剩余时间
294
- */
295
- parseTimeRemaining(timeRemaining, parsedTimeRemaining) {
296
- return parsedTimeRemaining
297
- .replace(/\syears?/, "年")
298
- .replace(/\days?/, "天")
299
- .replace(/\shours?/, "小时")
300
- .replace(/\sminutes?/, "分钟")
301
- .replace(/\sseconds?/, "秒");
302
- },
303
-
304
- checkChunkUploadedByResponse(chunk, message) {
305
- console.log(count);
306
- count++;
307
- let objMessage = JSON.parse(message);
308
- if (objMessage.success && objMessage.code == "00000") {
309
- return true;
310
- }
311
- return false;
312
- },
313
- /** ----- uploader options config end ----- */
314
-
315
- /** ----- req s ----- */
316
-
317
- /**
318
- * 初始化接口,获取分片上传 url token md5
319
- */
320
- // TODO:
321
- fetchConfig() {
322
- return axios
323
- .get("hospitalUpload/getUploadConfigNew")
324
- .then(({ data }) => {
325
- /**
326
- * channel: "HW_VIDEO" 视频渠道
327
- checkFileMd5Exist: "http://192.168.2.105:12060/storage/checkFileMd5Exist" 校验分片
328
- fileChannel: "ALI_OSS" 文件上传渠道
329
- md5: "0e22a1d7ba3540e3b631a31ace093cc8"
330
- objectName: "5425/234667/20210203"
331
- partFileMerge: "http://192.168.2.105:12060/storage/partFileMerge" 合并接口
332
- partFileUpload: "http://192.168.2.105:12060/storage/partFileUpload" 分片上传接口
333
- token: "d012a22a9f284801b1bed4c20f3715de" token
334
- */
335
- return Object.assign({}, { ...data.map });
336
- })
337
- .catch(err => {
338
- console.log(err);
339
- this.$message.error("获取上传配置失败");
340
- });
341
- // return request({
342
- // url: "/video/getUploadConfig"
343
- // }).then(res => {
344
- // return Object.assign({}, { ...res.data });
345
- // });
346
- },
347
-
348
- /**
349
- * 一键上传
350
- */
351
- handleStartUpload() {
352
- let len = this?.configList?.length || 0;
353
- if (len == 0) {
354
- this.$message.info("请选择文件");
355
- return;
356
- }
357
- this.$nextTick(() => {
358
- // upload api 调用没用
359
- // this.uploader.upload();
360
- this.configList.forEach(f => {
361
- let o = f.file_upload_status || {};
362
- if (o.status) {
363
- // f.resume();
364
- this.statusSet(f, "uploading");
365
- this.computeMD5(f);
366
- }
367
- });
368
- });
369
- },
370
-
371
- /**
372
- * 读取到文件
373
- */
374
- async onFileAdded(file) {
375
- let sizeFlag = this.checkSize(file);
376
- if (this.handleCheckExt(this.propsCategoryMap, file) || this.checkMaxLength() || sizeFlag) {
377
- file.ignored = true;
378
- return;
379
- }
380
- file.file_upload_status = ""; // 文件上传状态
381
- this.statusSet(file, "init");
382
- file.crm_upload_config = { ...file }; // 视频初始化信息
383
- this.configList.push(file);
384
- this.statusSet(file, "ready");
385
- // 自动上传
386
- if (this.autoStart) {
387
- // 暂停
388
- file.pause();
389
- this.computeMD5(file);
390
- }
391
- },
392
-
393
- checkSize(file) {
394
- const max_size = this?.max_size || "";
395
- if (!max_size) return false;
396
- let isLt = file.size / 1024 < +max_size;
397
- if (!isLt) {
398
- this.$message.error(`附件大小超过了${this.curMaxSize(max_size)}`);
399
- }
400
- return !isLt;
401
- },
402
-
403
- curMaxSize(curMax) {
404
- let useMax;
405
- if (curMax) {
406
- useMax = +(+curMax).toFixed(2);
407
- } else {
408
- return useMax;
409
- }
410
- if (useMax < 1024) {
411
- return useMax + "KB";
412
- } else if (useMax < 1024 * 1024) {
413
- return (useMax / 1024).toFixed(2) + "MB";
414
- } else if (useMax < 1024 * 1024 * 1024) {
415
- return (useMax / (1024 * 1024)).toFixed(2) + "GB";
416
- }
417
- },
418
-
419
- handleCheckExt(map, file) {
420
- let flag = false;
421
- if (map) {
422
- // getExtension() 得到小写的后缀
423
- if (map.includes("*")) {
424
- return false;
425
- }
426
- let ext = file.getExtension();
427
- if (!map.includes(ext)) {
428
- this.$message.error(`不支持${ext}格式`);
429
- flag = true;
430
- }
431
- }
432
- return flag;
433
- },
434
-
435
- checkMaxLength() {
436
- if (this.maxLength > 0) {
437
- let defLen = this?.defaultList?.length || 0;
438
- let len = this?.configList?.length || 0;
439
- if (this.maxLength <= defLen + len) {
440
- this.$message.error(`最多只能上传${this.maxLength}个`);
441
- return true;
442
- }
443
- }
444
- return false;
445
- },
446
-
447
- /**
448
- * 进度条
449
- */
450
- onFileProgress() {
451
- // rootFile, file, chunk
452
- // console.log(
453
- // `上传中 ${file.name},chunk:${chunk.startByte /
454
- // 1024 /
455
- // 1024} ~ ${chunk.endByte / 1024 / 1024}`
456
- // );
457
- },
458
-
459
- /**
460
- * 所有分片上传成功
461
- */
462
- onFileSuccess(rootFile, file, response) {
463
- let res = JSON.parse(response); // "{"success":true,"msg":"成功","code":"00000"}"
464
-
465
- // 服务器自定义的错误(即虽返回200,但是是错误的情况),这种错误是Uploader无法拦截的
466
- if (!res.success) {
467
- // this.$message({ message: res.message, type: "error" });
468
- // 文件状态设为“失败”
469
- this.statusSet(file, "failed");
470
- return;
471
- }
472
- // this.beginTimer(file);
473
- this.statusSet(file, "merging");
474
- this.mergeRequest(
475
- {
476
- md5: file.uniqueIdentifier,
477
- fileName: file.name,
478
- fileChunkNum: file.chunks.length
479
- },
480
- file
481
- );
482
-
483
- // 如果服务端返回需要合并
484
- if (res.needMerge) {
485
- // 文件状态设为“合并中”
486
- this.statusSet(file, "merging");
487
- }
488
- },
489
-
490
- /**
491
- * 上传错误
492
- */
493
- onFileError(rootFile, file) {
494
- // rootFile, file, response, chunk
495
- this.statusSet(file, "failed");
496
- // this.$message({
497
- // message: response,
498
- // type: "error"
499
- // });
500
- },
501
-
502
- /** 暂时不用
503
- * 计算md5,实现断点续传及秒传
504
- * @param file
505
- */
506
- computeMD5(file) {
507
- let fileReader = new FileReader();
508
- let time = new Date().getTime();
509
- let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
510
- let currentChunk = 0;
511
- const chunkSize = 10 * 1024 * 1000;
512
- let chunks = Math.ceil(file.size / chunkSize);
513
- let spark = new SparkMD5.ArrayBuffer();
514
-
515
- // 文件状态设为"计算MD5"
516
- this.statusSet(file, "md5");
517
- file.pause();
518
-
519
- loadNext();
520
-
521
- fileReader.onload = e => {
522
- spark.append(e.target.result);
523
-
524
- if (currentChunk < chunks) {
525
- currentChunk++;
526
- loadNext();
527
- } else {
528
- let md5 = spark.end();
529
- this.computeMD5Success(md5, file);
530
- }
531
- };
532
-
533
- fileReader.onerror = function() {
534
- console.warn(`文件${file.name}读取出错,请检查该文件`);
535
- file.cancel();
536
- };
537
-
538
- function loadNext() {
539
- let start = currentChunk * chunkSize;
540
- let end = start + chunkSize >= file.size ? file.size : start + chunkSize;
541
-
542
- fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end));
543
- }
544
- },
545
-
546
- /**
547
- * 展示不用
548
- */
549
- async computeMD5Success(md5, file) {
550
- try {
551
- const verifyData = await this.verifyUpload(file.name, md5, file);
552
-
553
- if (verifyData.code == "00000") {
554
- const { data } = verifyData || {};
555
-
556
- /** data ex
557
- * md5: "84c3312c13d15d672704a10a453a8faf"
558
- * path: "https://cdn.cnhis.cc/opendoc/5575/1298910791417647105/20201013/db2b30c2447b4c2e96101c88ddac1f38.mp4"
559
- * presence: true
560
- */
561
-
562
- if (data.presence) {
563
- // 已上传过的,直接修改为完成的状态
564
- this.statusSet(file, "complete");
565
- this.$set(file, "crm_chkuns_complete_status", "complete");
566
- this.$set(
567
- file,
568
- "crm_uploade_resInfo",
569
- { url: data.path, name: file.name, size: file.size } || {}
570
- );
571
- return;
572
- }
573
- }
574
-
575
- file.uniqueIdentifier = md5;
576
- this.statusSet(file, "uploading");
577
- file.resume();
578
- } catch (error) {
579
- console.log(error, "chunk-upload-computeMD5Success");
580
- }
581
- },
582
-
583
- close() {
584
- this.uploader.cancel();
585
- },
586
-
587
- /**
588
- * 自定义的状态
589
- * @param file
590
- * @param status
591
- */
592
- statusSet(file, status) {
593
- let statusMap = {
594
- init: {
595
- status: "init",
596
- text: "初始化中",
597
- bgc: "#fff"
598
- },
599
- md5: {
600
- status: "md5",
601
- text: "校验MD5",
602
- bgc: "#fff"
603
- },
604
- ready: {
605
- status: "ready",
606
- text: "初始化完成",
607
- bgc: "#fff"
608
- },
609
- merging: {
610
- status: "merging",
611
- text: "合并中",
612
- bgc: "#e2eeff"
613
- },
614
- uploading: {
615
- status: "uploading",
616
- text: "上传中",
617
- bgc: "#e2eeff"
618
- },
619
- transcoding: {
620
- status: "transcoding",
621
- text: "转码中",
622
- bgc: "#e2eeff"
623
- },
624
- paused: {
625
- status: "paused",
626
- text: "暂停",
627
- bgc: "#e2eeff"
628
- },
629
- failed: {
630
- status: "failed",
631
- text: "上传失败",
632
- bgc: "#e2eeff"
633
- },
634
- complete: {
635
- status: "complete",
636
- text: "上传完成",
637
- bgc: "#e2eeff"
638
- }
639
- };
640
- if (status === "failed") {
641
- file.pause && file.pause();
642
- }
643
- this.$set(file, "file_upload_status", { ...statusMap[status] });
644
- },
645
-
646
- /**
647
- * 格式化进度跳
648
- */
649
- formatedProgress(v, file) {
650
- if (file.crm_chkuns_complete_status == "complete") {
651
- return 100;
652
- }
653
- return parseInt(v * 100, 10);
654
- },
655
-
656
- /**
657
- * 删除
658
- */
659
- handleRemove(file) {
660
- file.cancel();
661
- let id = file.id;
662
- this.configList = this.configList.filter(c => c.id !== id);
663
- },
664
-
665
- /**
666
- * 上传状态
667
- */
668
- getUploadShowStatus(file, key = "text") {
669
- let status = file?.file_upload_status || {};
670
- return status[key];
671
- },
672
-
673
- /**
674
- * 组件销毁后
675
- */
676
- handleOnDestroyed() {},
677
-
678
- handleGetSumbitList() {
679
- let len = this?.configList?.length || 0;
680
- let list = [];
681
- if (len > 0) {
682
- this.configList.forEach(file => {
683
- if (file.crm_chkuns_complete_status == "complete")
684
- list.push({ size: file.size, ...file.crm_uploade_resInfo });
685
- });
686
- }
687
- this.$emit("getSumbitList", list);
688
- },
689
-
690
- confirm() {
691
- const { configList } = this;
692
- let len = configList?.length || 0;
693
- if (len === 0) {
694
- this.$message.info("请选择文件上传");
695
- return;
696
- }
697
- let list = configList.filter(
698
- v => !["complete", "failed"].includes(v.file_upload_status.status)
699
- );
700
-
701
- if (list.length > 0) {
702
- this.$message.info("请上传文件或者等待文件上传完成!");
703
- return;
704
- }
705
- this.handleGetSumbitList();
706
- this.cancel();
707
- },
708
-
709
- cancel() {
710
- this.close();
711
- this.handleOnDestroyed();
712
- this.configList = [];
713
- this.$emit("update:propsVisible", false);
714
- },
715
-
716
- // 文件上传之前的校验: 校验文件是否已存在
717
- verifyUpload(fileName, fileHash, file) {
718
- let url = this.uploadConfig.checkFileMd5Exist;
719
- return new Promise((resolve, reject) => {
720
- const obj = {
721
- md5: fileHash,
722
- fileName,
723
- ...this.uploadArguments
724
- };
725
- instance
726
- .get(url, { params: obj })
727
- .then(res => {
728
- resolve(res.data);
729
- })
730
- .catch(err => {
731
- this.statusSet(file, "failed");
732
- console.log("verifyUpload -> err", err);
733
- });
734
- });
735
- },
736
-
737
- // 通知服务端合并切片
738
- mergeRequest(data, file) {
739
- return new Promise((resolve, reject) => {
740
- const obj = {
741
- ...data,
742
- ...this.uploadArguments
743
- };
744
-
745
- instance
746
- .post(this.uploadConfig.partFileMerge, obj, {
747
- timeout: 0
748
- })
749
- .then(({ data }) => {
750
- // 清除storage
751
- if (data.code === "00000") {
752
- // this.$message.success('上传成功');
753
- // 判断是否所有都成功上传
754
- this.statusSet(file, "complete");
755
- if (this.$refs.uploader) {
756
- let resData = data?.data || {};
757
- this.$refs.uploader.fileList.forEach(v => {
758
- if (v.uniqueIdentifier == file.uniqueIdentifier) {
759
- this.$set(v, "crm_chkuns_complete_status", "complete");
760
- this.$set(v, "crm_uploade_resInfo", {
761
- url: resData.path || resData.url,
762
- name: file.name,
763
- size: file.size,
764
- ...resData
765
- });
766
- }
767
- });
768
- }
769
- resolve();
770
- } else {
771
- this.$message.error("上传失败");
772
- // 文件块数量不对,清除缓存
773
- resolve();
774
- }
775
- })
776
- .catch(err => {
777
- console.log("mergeRequest -> err", err);
778
- reject();
779
- });
780
- });
781
- },
782
-
783
- setAxios() {
784
- // if (!this.headers) return;
785
- for (const i in this.headers) {
786
- instance.defaults.headers.common[i] = this.headers[i];
787
- }
788
-
789
- // 是否携带cookie
790
- // if (this.withCredentials) {
791
- instance.defaults.withCredentials = this.withCredentials;
792
- // }
793
-
794
- // 设置baseUrl
795
- // if (this.baseUrl) {
796
- // instance.defaults.baseURL = "http://192.168.20.113:12060" || this.baseUrl;
797
- // }
798
-
799
- // 设置切片大小
800
- // chunkSize = this.chunkSize;
801
- },
802
-
803
- hanldeDraggerBtnClick() {
804
- const uploadBtn = this?.$refs?.uploadBtn || false;
805
- let input = uploadBtn?.$el?.querySelector("input") || false;
806
- if (input) {
807
- input.click();
808
- }
809
- },
810
-
811
- /**
812
- * 处理请求结果
813
- */
814
-
815
- processResponse(response, cb, file, Chunk) {
816
- cb(null, response);
817
-
818
- //
819
- // try {
820
- // let responseObj = response && JSON.parse(response);
821
- // if (!responseObj.success || responseObj.code != "00000") {
822
- // file.pause();
823
- // this.statusSet(file, "failed");
824
- // this.$message.error(responseObj.msg || "文件上传失败,请重新上传");
825
- // }
826
- // cb(null, response);
827
- // } catch (error) {
828
- // console.log(error);
829
- // this.statusSet(file, "failed");
830
- // file.pause();
831
- // this.$message.error("文件上传失败,请重新上传");
832
- // }
833
- }
834
-
835
- // error(msg) {
836
- // this.$notify({
837
- // title: "错误",
838
- // message: msg,
839
- // type: "error",
840
- // duration: 2000
841
- // });
842
- // }
843
- },
844
- watch: {},
845
- destroyed() {
846
- // Bus.$off("openUploader");
847
- this.handleOnDestroyed();
848
- },
849
- components: {
850
- Uploader,
851
- UploaderBtn,
852
- UploaderDrop,
853
- UploaderUnsupport,
854
- UploaderList,
855
- // UploaderFiles,
856
- UploaderFile,
857
- [Progress.name]: Progress,
858
- [Button.name]: Button,
859
- [Icon.name]: Icon
860
- }
861
- };
862
- </script>
863
-
864
- <style scoped lang="less">
865
- .chunk-upload-container {
866
- // position: fixed;
867
- // z-index: 20;
868
- // right: 15px;
869
- // bottom: 15px;
870
- // padding: 15px;
871
- background-color: #fff;
872
-
873
- .uploader-app {
874
- // width: 520px;
875
- min-width: 250px;
876
- }
877
-
878
- .upload-btn {
879
- padding: 20px 0px;
880
- .mgl-10 {
881
- margin-left: 10px;
882
- }
883
- }
884
-
885
- .no-file {
886
- position: absolute;
887
- top: 50%;
888
- left: 50%;
889
- transform: translate(-50%, -50%);
890
- font-size: 16px;
891
- }
892
-
893
- /deep/.uploader-file-icon {
894
- &:before {
895
- content: "" !important;
896
- }
897
- }
898
-
899
- /deep/.uploader-file-actions > span {
900
- margin-right: 6px;
901
- }
902
- }
903
-
904
- .file-list-conatiner {
905
- background-color: #fff;
906
- // min-height: 100px;
907
- height: 300px;
908
- margin-top: 20px;
909
- overflow: hidden;
910
- overflow-y: auto;
911
- // border: 1px solid #d5d5d5;
912
- // border-radius: 4px;
913
-
914
- /deep/ .uploader-file {
915
- height: auto;
916
- line-height: initial;
917
- border-bottom: none;
918
- }
919
- }
920
-
921
- .c-file-container {
922
- .c-f-item {
923
- display: flex;
924
-
925
- &-icon {
926
- width: 50px;
927
- text-align: center;
928
- display: flex;
929
- justify-content: center;
930
- align-items: center;
931
- }
932
-
933
- &-info {
934
- flex: 1;
935
- line-height: 20px;
936
-
937
- &-title {
938
- line-height: 24px;
939
- .title {
940
- font-size: 14px;
941
- font-family: PingFangSC-Medium, PingFang SC;
942
- font-weight: 500;
943
- color: rgba(0, 0, 0, 0.85);
944
- }
945
- .size {
946
- font-size: 12px;
947
- color: #9d9d9d;
948
- }
949
- }
950
-
951
- &-time {
952
- font-size: 12px;
953
- color: #9d9d9d;
954
- }
955
- }
956
-
957
- &-btn {
958
- width: 100px;
959
- line-height: 40px;
960
- i {
961
- padding: 0 5px;
962
- }
963
- }
964
- }
965
- /deep/ .ant-progress {
966
- line-height: 1;
967
- }
968
- }
969
-
970
- .file-boder-bottom {
971
- border-bottom: 1px solid #d5d5d5;
972
- }
973
-
974
- .drap-container {
975
- position: relative;
976
- padding-top: 45px;
977
- overflow: hidden;
978
- border-radius: 4px;
979
- border: 1px dashed #5585f5;
980
- background-color: #f9f9f9;
981
- text-align: center;
982
- height: 180px;
983
- line-height: 1.5;
984
- color: #5585f5;
985
- // margin-bottom: 20px;
986
- cursor: pointer;
987
- i {
988
- font-size: 56px;
989
- margin-bottom: 20px;
990
- }
991
- }
992
- </style>
993
-
994
- <style lang="less">
995
- .chunk-upload-container {
996
- div.uploader-drop {
997
- padding: 0;
998
- border: none;
999
- }
1000
- }
1001
- </style>
1
+ <template>
2
+ <div class="chunk-upload-container">
3
+ <!-- 上传 -->
4
+ <uploader
5
+ ref="uploader"
6
+ :options="options"
7
+ :autoStart="autoStart"
8
+ @file-added="onFileAdded"
9
+ @file-success="onFileSuccess"
10
+ @file-progress="onFileProgress"
11
+ @file-error="onFileError"
12
+ class="uploader-app"
13
+ >
14
+ <uploader-unsupport></uploader-unsupport>
15
+
16
+ <uploader-drop>
17
+ <div class="drap-container dragger-btn" @click="hanldeDraggerBtnClick">
18
+ <a-icon type="folder-add" />
19
+ <p>点击或将文件拖拽到这里上传</p>
20
+ </div>
21
+ </uploader-drop>
22
+
23
+ <uploader-list>
24
+ <div slot-scope="props" class="file-list-conatiner">
25
+ <ul class="file-list">
26
+ <li v-for="file in props.fileList" :key="file.id">
27
+ <uploader-file :class="'file_' + file.id" ref="files" :file="file" :list="true">
28
+ <div
29
+ slot-scope="props"
30
+ class="c-file-container"
31
+ :class="{
32
+ 'file-boder-bottom': ['complete', 'failed'].includes(
33
+ getUploadShowStatus(file, 'status')
34
+ )
35
+ }"
36
+ >
37
+ <!-- icon -->
38
+ <div class="c-f-item">
39
+ <div class="c-f-item-icon">
40
+ <a-icon type="paper-clip" style="color:#5585F5;" />
41
+ </div>
42
+ <div class="c-f-item-info">
43
+ <!-- <a-spin
44
+ :spinning="
45
+ ['uploading', 'merging'].includes(getUploadShowStatus(file, 'status'))
46
+ "
47
+ > -->
48
+ <div class="c-f-item-info-title">
49
+ <span class="title">
50
+ {{ file.name }}
51
+ </span>
52
+ <span class="size"> ({{ props.formatedSize }}) </span>
53
+ </div>
54
+ <div class="c-f-item-info-time">
55
+ <span>
56
+ {{ props.formatedTimeRemaining }}
57
+ </span>
58
+ <span>
59
+ {{ getUploadShowStatus(file, "text") }}
60
+ </span>
61
+ </div>
62
+ <!-- </a-spin> -->
63
+
64
+ <!-- {{ props.progress }} -->
65
+ </div>
66
+ <div class="c-f-item-btn">
67
+ <!-- <a-icon type="redo" @click="file.resume()" />
68
+ <a-icon type="pause" @click="file.pause()" /> -->
69
+ <a-icon type="close" @click="handleRemove(file)" />
70
+
71
+ <!-- .pause() 暂停上窜文件。
72
+ .resume() 继续上传文件。
73
+ .cancel() 取消上传且从文件列表中移除。
74
+ .retry() 重新上传文件。 -->
75
+ </div>
76
+ </div>
77
+
78
+ <a-progress
79
+ :percent="formatedProgress(props.progress, file)"
80
+ :show-info="false"
81
+ :strokeWidth="2"
82
+ />
83
+ </div>
84
+ </uploader-file>
85
+ </li>
86
+ <!-- <div class="no-file" v-if="!props.fileList.length">
87
+ <i class="iconfont icon-empty-file"></i> 暂无待上传文件
88
+ </div> -->
89
+ </ul>
90
+ </div>
91
+ </uploader-list>
92
+
93
+ <div class="upload-btn">
94
+ <uploader-btn v-show="false" :attrs="btnAttrs" ref="uploadBtn">
95
+ <span>
96
+ 上传新文件
97
+ </span></uploader-btn
98
+ >
99
+ <a-button type="primary" class="mgl-10" @click="handleStartUpload">开始上传</a-button>
100
+ </div>
101
+ </uploader>
102
+ </div>
103
+ </template>
104
+
105
+ <script>
106
+ /**
107
+ * getChunkUploadConfig()
108
+ */
109
+ import {
110
+ Uploader,
111
+ UploaderBtn,
112
+ UploaderDrop,
113
+ UploaderUnsupport,
114
+ UploaderList,
115
+ // UploaderFiles,
116
+ UploaderFile
117
+ } from "vue-simple-uploader";
118
+ import SparkMD5 from "spark-md5";
119
+ import axios, { CancelToken } from "axios";
120
+ import {Progress,Button,Icon} from 'ant-design-vue'
121
+ var instance = axios.create({});
122
+ const chunkSize = 3 * 1024 * 1024;
123
+ let count = 1;
124
+ export default {
125
+ name: "chunkUploadCom",
126
+ props: {
127
+ propsVisible: {
128
+ type: Boolean,
129
+ default: false
130
+ },
131
+ propsCategoryMap: {
132
+ type: String,
133
+ default: ""
134
+ },
135
+ max_size: {
136
+ type: String,
137
+ default: ""
138
+ },
139
+ maxLength: {
140
+ type: Number,
141
+ default: 0
142
+ },
143
+ defaultList: {
144
+ type: Array,
145
+ default: () => []
146
+ },
147
+ // 临时自测使用
148
+ // uploadArguments: {
149
+ // type: Object,
150
+ // default: () => {
151
+ // return {
152
+ // type: "video"
153
+ // };
154
+ // }
155
+ // },
156
+
157
+ uploaderType: {
158
+ type: String,
159
+ default: "video"
160
+ },
161
+
162
+ getChunkUploadConfig:{
163
+ type: Function,
164
+ default: () => Promise.resolve({})
165
+ }
166
+ },
167
+ data() {
168
+ return {
169
+ spinning: false,
170
+ uploadConfig: {},
171
+ options: {
172
+ target: this.handleGetTargetUrl,
173
+ chunkSize: chunkSize,
174
+ fileParameterName: "file",
175
+ maxChunkRetries: 3, // 上载失败之前,块的最大重试次数
176
+ simultaneousUploads: 3, // 分片同时上传数
177
+ prioritizeFirstAndLastChunk: true,
178
+ forceChunkSize: true,
179
+ testChunks: false, // 是否开启服务器分片校验
180
+ // 服务器分片校验函数,秒传及断点续传基础
181
+ // checkChunkUploadedByResponse: this.checkChunkUploadedByResponse,
182
+ headers: this.handleProcessHeaders,
183
+ query() {},
184
+ processParams: this.handleProcessParams,
185
+ parseTimeRemaining: this.parseTimeRemaining,
186
+ processResponse: this.processResponse
187
+ },
188
+ attrs: {},
189
+ collapse: false,
190
+
191
+ configList: [],
192
+ share: 1, // 是否共享 0私有 1共享
193
+ baseUrl: "http://192.168.20.113:12060",
194
+ headers: {
195
+ Authorization: "bearer " + "d012a22a9f284801b1bed4c20f3715de"
196
+ },
197
+ withCredentials: false
198
+ };
199
+ },
200
+ created() {
201
+ this.init()
202
+ },
203
+ mounted() {},
204
+ computed: {
205
+ // Uploader实例
206
+ uploader() {
207
+ return this.$refs.uploader.uploader;
208
+ },
209
+ // 读取到文件自动上传
210
+ autoStart() {
211
+ return false;
212
+ },
213
+ visible: {
214
+ get() {
215
+ return this.propsVisible;
216
+ }
217
+ },
218
+ btnAttrs() {
219
+ return {
220
+ accept: this.propsCategoryMap
221
+ };
222
+ },
223
+
224
+ uploadArgumentsObj() {
225
+ return { ...this.uploadArguments, share: this.share };
226
+ },
227
+
228
+ channel() {
229
+ if (Object.keys(this.uploadConfig || {}).length === 0) {
230
+ return undefined;
231
+ }
232
+ return this.uploaderType === "file"
233
+ ? this.uploadConfig.fileChannel
234
+ : this.uploadConfig.channel;
235
+ },
236
+
237
+ uploadArguments() {
238
+ return {
239
+ type: this.uploaderType,
240
+ channel: this.channel
241
+ };
242
+ }
243
+ },
244
+ methods: {
245
+ init(){
246
+ try {
247
+ this.getChunkUploadConfig().then(res => {
248
+ this.uploadConfig = { ...res };
249
+ this.headers = {
250
+ Authorization: "bearer " + this.uploadConfig.token
251
+ };
252
+ this.setAxios();
253
+ });
254
+ } catch (error) {
255
+ console.log(error)
256
+ }
257
+ },
258
+ /** ----- uploader options config start ----- */
259
+
260
+ /**
261
+ * 上传参数转换
262
+ */
263
+ handleProcessParams(params, file) {
264
+ let res = {
265
+ channel: this.channel,
266
+ md5: file.uniqueIdentifier,
267
+ name: params.filename,
268
+ chunk: params.chunkNumber - 1,
269
+ chunks: params.totalChunks,
270
+ chunkSize: params.currentChunkSize
271
+ };
272
+ count++;
273
+ return res || params;
274
+ },
275
+
276
+ /**
277
+ * 获取请求头
278
+ */
279
+ handleProcessHeaders() {
280
+ return {
281
+ Authorization: "bearer " + this.uploadConfig.token
282
+ };
283
+ },
284
+
285
+ /**
286
+ * 获取分片上传url
287
+ */
288
+ handleGetTargetUrl(file) {
289
+ return this?.uploadConfig?.partFileUpload || "";
290
+ },
291
+
292
+ /**
293
+ * 格式化上传剩余时间
294
+ */
295
+ parseTimeRemaining(timeRemaining, parsedTimeRemaining) {
296
+ return parsedTimeRemaining
297
+ .replace(/\syears?/, "年")
298
+ .replace(/\days?/, "天")
299
+ .replace(/\shours?/, "小时")
300
+ .replace(/\sminutes?/, "分钟")
301
+ .replace(/\sseconds?/, "秒");
302
+ },
303
+
304
+ checkChunkUploadedByResponse(chunk, message) {
305
+ console.log(count);
306
+ count++;
307
+ let objMessage = JSON.parse(message);
308
+ if (objMessage.success && objMessage.code == "00000") {
309
+ return true;
310
+ }
311
+ return false;
312
+ },
313
+ /** ----- uploader options config end ----- */
314
+
315
+ /** ----- req s ----- */
316
+
317
+ /**
318
+ * 初始化接口,获取分片上传 url token md5
319
+ */
320
+ // TODO:
321
+ fetchConfig() {
322
+ return axios
323
+ .get("hospitalUpload/getUploadConfigNew")
324
+ .then(({ data }) => {
325
+ /**
326
+ * channel: "HW_VIDEO" 视频渠道
327
+ checkFileMd5Exist: "http://192.168.2.105:12060/storage/checkFileMd5Exist" 校验分片
328
+ fileChannel: "ALI_OSS" 文件上传渠道
329
+ md5: "0e22a1d7ba3540e3b631a31ace093cc8"
330
+ objectName: "5425/234667/20210203"
331
+ partFileMerge: "http://192.168.2.105:12060/storage/partFileMerge" 合并接口
332
+ partFileUpload: "http://192.168.2.105:12060/storage/partFileUpload" 分片上传接口
333
+ token: "d012a22a9f284801b1bed4c20f3715de" token
334
+ */
335
+ return Object.assign({}, { ...data.map });
336
+ })
337
+ .catch(err => {
338
+ console.log(err);
339
+ this.$message.error("获取上传配置失败");
340
+ });
341
+ // return request({
342
+ // url: "/video/getUploadConfig"
343
+ // }).then(res => {
344
+ // return Object.assign({}, { ...res.data });
345
+ // });
346
+ },
347
+
348
+ /**
349
+ * 一键上传
350
+ */
351
+ handleStartUpload() {
352
+ let len = this?.configList?.length || 0;
353
+ if (len == 0) {
354
+ this.$message.info("请选择文件");
355
+ return;
356
+ }
357
+ this.$nextTick(() => {
358
+ // upload api 调用没用
359
+ // this.uploader.upload();
360
+ this.configList.forEach(f => {
361
+ let o = f.file_upload_status || {};
362
+ if (o.status) {
363
+ // f.resume();
364
+ this.statusSet(f, "uploading");
365
+ this.computeMD5(f);
366
+ }
367
+ });
368
+ });
369
+ },
370
+
371
+ /**
372
+ * 读取到文件
373
+ */
374
+ async onFileAdded(file) {
375
+ let sizeFlag = this.checkSize(file);
376
+ if (this.handleCheckExt(this.propsCategoryMap, file) || this.checkMaxLength() || sizeFlag) {
377
+ file.ignored = true;
378
+ return;
379
+ }
380
+ file.file_upload_status = ""; // 文件上传状态
381
+ this.statusSet(file, "init");
382
+ file.crm_upload_config = { ...file }; // 视频初始化信息
383
+ this.configList.push(file);
384
+ this.statusSet(file, "ready");
385
+ // 自动上传
386
+ if (this.autoStart) {
387
+ // 暂停
388
+ file.pause();
389
+ this.computeMD5(file);
390
+ }
391
+ },
392
+
393
+ checkSize(file) {
394
+ const max_size = this?.max_size || "";
395
+ if (!max_size) return false;
396
+ let isLt = file.size / 1024 < +max_size;
397
+ if (!isLt) {
398
+ this.$message.error(`附件大小超过了${this.curMaxSize(max_size)}`);
399
+ }
400
+ return !isLt;
401
+ },
402
+
403
+ curMaxSize(curMax) {
404
+ let useMax;
405
+ if (curMax) {
406
+ useMax = +(+curMax).toFixed(2);
407
+ } else {
408
+ return useMax;
409
+ }
410
+ if (useMax < 1024) {
411
+ return useMax + "KB";
412
+ } else if (useMax < 1024 * 1024) {
413
+ return (useMax / 1024).toFixed(2) + "MB";
414
+ } else if (useMax < 1024 * 1024 * 1024) {
415
+ return (useMax / (1024 * 1024)).toFixed(2) + "GB";
416
+ }
417
+ },
418
+
419
+ handleCheckExt(map, file) {
420
+ let flag = false;
421
+ if (map) {
422
+ // getExtension() 得到小写的后缀
423
+ if (map.includes("*")) {
424
+ return false;
425
+ }
426
+ let ext = file.getExtension();
427
+ if (!map.includes(ext)) {
428
+ this.$message.error(`不支持${ext}格式`);
429
+ flag = true;
430
+ }
431
+ }
432
+ return flag;
433
+ },
434
+
435
+ checkMaxLength() {
436
+ if (this.maxLength > 0) {
437
+ let defLen = this?.defaultList?.length || 0;
438
+ let len = this?.configList?.length || 0;
439
+ if (this.maxLength <= defLen + len) {
440
+ this.$message.error(`最多只能上传${this.maxLength}个`);
441
+ return true;
442
+ }
443
+ }
444
+ return false;
445
+ },
446
+
447
+ /**
448
+ * 进度条
449
+ */
450
+ onFileProgress() {
451
+ // rootFile, file, chunk
452
+ // console.log(
453
+ // `上传中 ${file.name},chunk:${chunk.startByte /
454
+ // 1024 /
455
+ // 1024} ~ ${chunk.endByte / 1024 / 1024}`
456
+ // );
457
+ },
458
+
459
+ /**
460
+ * 所有分片上传成功
461
+ */
462
+ onFileSuccess(rootFile, file, response) {
463
+ let res = JSON.parse(response); // "{"success":true,"msg":"成功","code":"00000"}"
464
+
465
+ // 服务器自定义的错误(即虽返回200,但是是错误的情况),这种错误是Uploader无法拦截的
466
+ if (!res.success) {
467
+ // this.$message({ message: res.message, type: "error" });
468
+ // 文件状态设为“失败”
469
+ this.statusSet(file, "failed");
470
+ return;
471
+ }
472
+ // this.beginTimer(file);
473
+ this.statusSet(file, "merging");
474
+ this.mergeRequest(
475
+ {
476
+ md5: file.uniqueIdentifier,
477
+ fileName: file.name,
478
+ fileChunkNum: file.chunks.length
479
+ },
480
+ file
481
+ );
482
+
483
+ // 如果服务端返回需要合并
484
+ if (res.needMerge) {
485
+ // 文件状态设为“合并中”
486
+ this.statusSet(file, "merging");
487
+ }
488
+ },
489
+
490
+ /**
491
+ * 上传错误
492
+ */
493
+ onFileError(rootFile, file) {
494
+ // rootFile, file, response, chunk
495
+ this.statusSet(file, "failed");
496
+ // this.$message({
497
+ // message: response,
498
+ // type: "error"
499
+ // });
500
+ },
501
+
502
+ /** 暂时不用
503
+ * 计算md5,实现断点续传及秒传
504
+ * @param file
505
+ */
506
+ computeMD5(file) {
507
+ let fileReader = new FileReader();
508
+ let time = new Date().getTime();
509
+ let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
510
+ let currentChunk = 0;
511
+ const chunkSize = 10 * 1024 * 1000;
512
+ let chunks = Math.ceil(file.size / chunkSize);
513
+ let spark = new SparkMD5.ArrayBuffer();
514
+
515
+ // 文件状态设为"计算MD5"
516
+ this.statusSet(file, "md5");
517
+ file.pause();
518
+
519
+ loadNext();
520
+
521
+ fileReader.onload = e => {
522
+ spark.append(e.target.result);
523
+
524
+ if (currentChunk < chunks) {
525
+ currentChunk++;
526
+ loadNext();
527
+ } else {
528
+ let md5 = spark.end();
529
+ this.computeMD5Success(md5, file);
530
+ }
531
+ };
532
+
533
+ fileReader.onerror = function() {
534
+ console.warn(`文件${file.name}读取出错,请检查该文件`);
535
+ file.cancel();
536
+ };
537
+
538
+ function loadNext() {
539
+ let start = currentChunk * chunkSize;
540
+ let end = start + chunkSize >= file.size ? file.size : start + chunkSize;
541
+
542
+ fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end));
543
+ }
544
+ },
545
+
546
+ /**
547
+ * 展示不用
548
+ */
549
+ async computeMD5Success(md5, file) {
550
+ try {
551
+ const verifyData = await this.verifyUpload(file.name, md5, file);
552
+
553
+ if (verifyData.code == "00000") {
554
+ const { data } = verifyData || {};
555
+
556
+ /** data ex
557
+ * md5: "84c3312c13d15d672704a10a453a8faf"
558
+ * path: "https://cdn.cnhis.cc/opendoc/5575/1298910791417647105/20201013/db2b30c2447b4c2e96101c88ddac1f38.mp4"
559
+ * presence: true
560
+ */
561
+
562
+ if (data.presence) {
563
+ // 已上传过的,直接修改为完成的状态
564
+ this.statusSet(file, "complete");
565
+ this.$set(file, "crm_chkuns_complete_status", "complete");
566
+ this.$set(
567
+ file,
568
+ "crm_uploade_resInfo",
569
+ { url: data.path, name: file.name, size: file.size } || {}
570
+ );
571
+ return;
572
+ }
573
+ }
574
+
575
+ file.uniqueIdentifier = md5;
576
+ this.statusSet(file, "uploading");
577
+ file.resume();
578
+ } catch (error) {
579
+ console.log(error, "chunk-upload-computeMD5Success");
580
+ }
581
+ },
582
+
583
+ close() {
584
+ this.uploader.cancel();
585
+ },
586
+
587
+ /**
588
+ * 自定义的状态
589
+ * @param file
590
+ * @param status
591
+ */
592
+ statusSet(file, status) {
593
+ let statusMap = {
594
+ init: {
595
+ status: "init",
596
+ text: "初始化中",
597
+ bgc: "#fff"
598
+ },
599
+ md5: {
600
+ status: "md5",
601
+ text: "校验MD5",
602
+ bgc: "#fff"
603
+ },
604
+ ready: {
605
+ status: "ready",
606
+ text: "初始化完成",
607
+ bgc: "#fff"
608
+ },
609
+ merging: {
610
+ status: "merging",
611
+ text: "合并中",
612
+ bgc: "#e2eeff"
613
+ },
614
+ uploading: {
615
+ status: "uploading",
616
+ text: "上传中",
617
+ bgc: "#e2eeff"
618
+ },
619
+ transcoding: {
620
+ status: "transcoding",
621
+ text: "转码中",
622
+ bgc: "#e2eeff"
623
+ },
624
+ paused: {
625
+ status: "paused",
626
+ text: "暂停",
627
+ bgc: "#e2eeff"
628
+ },
629
+ failed: {
630
+ status: "failed",
631
+ text: "上传失败",
632
+ bgc: "#e2eeff"
633
+ },
634
+ complete: {
635
+ status: "complete",
636
+ text: "上传完成",
637
+ bgc: "#e2eeff"
638
+ }
639
+ };
640
+ if (status === "failed") {
641
+ file.pause && file.pause();
642
+ }
643
+ this.$set(file, "file_upload_status", { ...statusMap[status] });
644
+ },
645
+
646
+ /**
647
+ * 格式化进度跳
648
+ */
649
+ formatedProgress(v, file) {
650
+ if (file.crm_chkuns_complete_status == "complete") {
651
+ return 100;
652
+ }
653
+ return parseInt(v * 100, 10);
654
+ },
655
+
656
+ /**
657
+ * 删除
658
+ */
659
+ handleRemove(file) {
660
+ file.cancel();
661
+ let id = file.id;
662
+ this.configList = this.configList.filter(c => c.id !== id);
663
+ },
664
+
665
+ /**
666
+ * 上传状态
667
+ */
668
+ getUploadShowStatus(file, key = "text") {
669
+ let status = file?.file_upload_status || {};
670
+ return status[key];
671
+ },
672
+
673
+ /**
674
+ * 组件销毁后
675
+ */
676
+ handleOnDestroyed() {},
677
+
678
+ handleGetSumbitList() {
679
+ let len = this?.configList?.length || 0;
680
+ let list = [];
681
+ if (len > 0) {
682
+ this.configList.forEach(file => {
683
+ if (file.crm_chkuns_complete_status == "complete")
684
+ list.push({ size: file.size, ...file.crm_uploade_resInfo });
685
+ });
686
+ }
687
+ this.$emit("getSumbitList", list);
688
+ },
689
+
690
+ confirm() {
691
+ const { configList } = this;
692
+ let len = configList?.length || 0;
693
+ if (len === 0) {
694
+ this.$message.info("请选择文件上传");
695
+ return;
696
+ }
697
+ let list = configList.filter(
698
+ v => !["complete", "failed"].includes(v.file_upload_status.status)
699
+ );
700
+
701
+ if (list.length > 0) {
702
+ this.$message.info("请上传文件或者等待文件上传完成!");
703
+ return;
704
+ }
705
+ this.handleGetSumbitList();
706
+ this.cancel();
707
+ },
708
+
709
+ cancel() {
710
+ this.close();
711
+ this.handleOnDestroyed();
712
+ this.configList = [];
713
+ this.$emit("update:propsVisible", false);
714
+ },
715
+
716
+ // 文件上传之前的校验: 校验文件是否已存在
717
+ verifyUpload(fileName, fileHash, file) {
718
+ let url = this.uploadConfig.checkFileMd5Exist;
719
+ return new Promise((resolve, reject) => {
720
+ const obj = {
721
+ md5: fileHash,
722
+ fileName,
723
+ ...this.uploadArguments
724
+ };
725
+ instance
726
+ .get(url, { params: obj })
727
+ .then(res => {
728
+ resolve(res.data);
729
+ })
730
+ .catch(err => {
731
+ this.statusSet(file, "failed");
732
+ console.log("verifyUpload -> err", err);
733
+ });
734
+ });
735
+ },
736
+
737
+ // 通知服务端合并切片
738
+ mergeRequest(data, file) {
739
+ return new Promise((resolve, reject) => {
740
+ const obj = {
741
+ ...data,
742
+ ...this.uploadArguments
743
+ };
744
+
745
+ instance
746
+ .post(this.uploadConfig.partFileMerge, obj, {
747
+ timeout: 0
748
+ })
749
+ .then(({ data }) => {
750
+ // 清除storage
751
+ if (data.code === "00000") {
752
+ // this.$message.success('上传成功');
753
+ // 判断是否所有都成功上传
754
+ this.statusSet(file, "complete");
755
+ if (this.$refs.uploader) {
756
+ let resData = data?.data || {};
757
+ this.$refs.uploader.fileList.forEach(v => {
758
+ if (v.uniqueIdentifier == file.uniqueIdentifier) {
759
+ this.$set(v, "crm_chkuns_complete_status", "complete");
760
+ this.$set(v, "crm_uploade_resInfo", {
761
+ url: resData.path || resData.url,
762
+ name: file.name,
763
+ size: file.size,
764
+ ...resData
765
+ });
766
+ }
767
+ });
768
+ }
769
+ resolve();
770
+ } else {
771
+ this.$message.error("上传失败");
772
+ // 文件块数量不对,清除缓存
773
+ resolve();
774
+ }
775
+ })
776
+ .catch(err => {
777
+ console.log("mergeRequest -> err", err);
778
+ reject();
779
+ });
780
+ });
781
+ },
782
+
783
+ setAxios() {
784
+ // if (!this.headers) return;
785
+ for (const i in this.headers) {
786
+ instance.defaults.headers.common[i] = this.headers[i];
787
+ }
788
+
789
+ // 是否携带cookie
790
+ // if (this.withCredentials) {
791
+ instance.defaults.withCredentials = this.withCredentials;
792
+ // }
793
+
794
+ // 设置baseUrl
795
+ // if (this.baseUrl) {
796
+ // instance.defaults.baseURL = "http://192.168.20.113:12060" || this.baseUrl;
797
+ // }
798
+
799
+ // 设置切片大小
800
+ // chunkSize = this.chunkSize;
801
+ },
802
+
803
+ hanldeDraggerBtnClick() {
804
+ const uploadBtn = this?.$refs?.uploadBtn || false;
805
+ let input = uploadBtn?.$el?.querySelector("input") || false;
806
+ if (input) {
807
+ input.click();
808
+ }
809
+ },
810
+
811
+ /**
812
+ * 处理请求结果
813
+ */
814
+
815
+ processResponse(response, cb, file, Chunk) {
816
+ cb(null, response);
817
+
818
+ //
819
+ // try {
820
+ // let responseObj = response && JSON.parse(response);
821
+ // if (!responseObj.success || responseObj.code != "00000") {
822
+ // file.pause();
823
+ // this.statusSet(file, "failed");
824
+ // this.$message.error(responseObj.msg || "文件上传失败,请重新上传");
825
+ // }
826
+ // cb(null, response);
827
+ // } catch (error) {
828
+ // console.log(error);
829
+ // this.statusSet(file, "failed");
830
+ // file.pause();
831
+ // this.$message.error("文件上传失败,请重新上传");
832
+ // }
833
+ }
834
+
835
+ // error(msg) {
836
+ // this.$notify({
837
+ // title: "错误",
838
+ // message: msg,
839
+ // type: "error",
840
+ // duration: 2000
841
+ // });
842
+ // }
843
+ },
844
+ watch: {},
845
+ destroyed() {
846
+ // Bus.$off("openUploader");
847
+ this.handleOnDestroyed();
848
+ },
849
+ components: {
850
+ Uploader,
851
+ UploaderBtn,
852
+ UploaderDrop,
853
+ UploaderUnsupport,
854
+ UploaderList,
855
+ // UploaderFiles,
856
+ UploaderFile,
857
+ [Progress.name]: Progress,
858
+ [Button.name]: Button,
859
+ [Icon.name]: Icon
860
+ }
861
+ };
862
+ </script>
863
+
864
+ <style scoped lang="less">
865
+ .chunk-upload-container {
866
+ // position: fixed;
867
+ // z-index: 20;
868
+ // right: 15px;
869
+ // bottom: 15px;
870
+ // padding: 15px;
871
+ background-color: #fff;
872
+
873
+ .uploader-app {
874
+ // width: 520px;
875
+ min-width: 250px;
876
+ }
877
+
878
+ .upload-btn {
879
+ padding: 20px 0px;
880
+ .mgl-10 {
881
+ margin-left: 10px;
882
+ }
883
+ }
884
+
885
+ .no-file {
886
+ position: absolute;
887
+ top: 50%;
888
+ left: 50%;
889
+ transform: translate(-50%, -50%);
890
+ font-size: 16px;
891
+ }
892
+
893
+ /deep/.uploader-file-icon {
894
+ &:before {
895
+ content: "" !important;
896
+ }
897
+ }
898
+
899
+ /deep/.uploader-file-actions > span {
900
+ margin-right: 6px;
901
+ }
902
+ }
903
+
904
+ .file-list-conatiner {
905
+ background-color: #fff;
906
+ // min-height: 100px;
907
+ height: 300px;
908
+ margin-top: 20px;
909
+ overflow: hidden;
910
+ overflow-y: auto;
911
+ // border: 1px solid #d5d5d5;
912
+ // border-radius: 4px;
913
+
914
+ /deep/ .uploader-file {
915
+ height: auto;
916
+ line-height: initial;
917
+ border-bottom: none;
918
+ }
919
+ }
920
+
921
+ .c-file-container {
922
+ .c-f-item {
923
+ display: flex;
924
+
925
+ &-icon {
926
+ width: 50px;
927
+ text-align: center;
928
+ display: flex;
929
+ justify-content: center;
930
+ align-items: center;
931
+ }
932
+
933
+ &-info {
934
+ flex: 1;
935
+ line-height: 20px;
936
+
937
+ &-title {
938
+ line-height: 24px;
939
+ .title {
940
+ font-size: 14px;
941
+ font-family: PingFangSC-Medium, PingFang SC;
942
+ font-weight: 500;
943
+ color: rgba(0, 0, 0, 0.85);
944
+ }
945
+ .size {
946
+ font-size: 12px;
947
+ color: #9d9d9d;
948
+ }
949
+ }
950
+
951
+ &-time {
952
+ font-size: 12px;
953
+ color: #9d9d9d;
954
+ }
955
+ }
956
+
957
+ &-btn {
958
+ width: 100px;
959
+ line-height: 40px;
960
+ i {
961
+ padding: 0 5px;
962
+ }
963
+ }
964
+ }
965
+ /deep/ .ant-progress {
966
+ line-height: 1;
967
+ }
968
+ }
969
+
970
+ .file-boder-bottom {
971
+ border-bottom: 1px solid #d5d5d5;
972
+ }
973
+
974
+ .drap-container {
975
+ position: relative;
976
+ padding-top: 45px;
977
+ overflow: hidden;
978
+ border-radius: 4px;
979
+ border: 1px dashed #5585f5;
980
+ background-color: #f9f9f9;
981
+ text-align: center;
982
+ height: 180px;
983
+ line-height: 1.5;
984
+ color: #5585f5;
985
+ // margin-bottom: 20px;
986
+ cursor: pointer;
987
+ i {
988
+ font-size: 56px;
989
+ margin-bottom: 20px;
990
+ }
991
+ }
992
+ </style>
993
+
994
+ <style lang="less">
995
+ .chunk-upload-container {
996
+ div.uploader-drop {
997
+ padding: 0;
998
+ border: none;
999
+ }
1000
+ }
1001
+ </style>