@smallwei/avue 3.8.2 → 3.8.4

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 (374) hide show
  1. package/README.md +206 -86
  2. package/dist/avue.js +37302 -0
  3. package/dist/avue.js.map +1 -0
  4. package/dist/avue.min.js +6 -0
  5. package/dist/avue.min.mjs +2 -0
  6. package/dist/avue.mjs +2 -0
  7. package/dist/index.css +1 -0
  8. package/es/avue.min.mjs +2 -0
  9. package/es/avue.min.ts +2 -0
  10. package/es/avue.mjs +2 -0
  11. package/es/avue.ts +2 -0
  12. package/es/core/create.mjs +8 -0
  13. package/es/core/create.ts +16 -0
  14. package/es/core/dataformat.mjs +184 -0
  15. package/es/core/dataformat.ts +190 -0
  16. package/es/core/detail.mjs +74 -0
  17. package/es/core/detail.ts +81 -0
  18. package/es/core/dic.mjs +213 -0
  19. package/es/core/dic.ts +235 -0
  20. package/es/core/locale.mjs +8 -0
  21. package/es/core/locale.ts +9 -0
  22. package/es/core/packages.mjs +61 -0
  23. package/es/core/packages.ts +62 -0
  24. package/es/core/slot.mjs +32 -0
  25. package/es/core/slot.ts +30 -0
  26. package/es/global/variable.mjs +80 -0
  27. package/es/global/variable.ts +84 -0
  28. package/es/icon.mjs +9 -0
  29. package/es/icon.ts +11 -0
  30. package/es/index.mjs +127 -0
  31. package/es/index.ts +177 -0
  32. package/es/locale/browser/en.mjs +288 -0
  33. package/es/locale/browser/zh-cn.mjs +288 -0
  34. package/es/locale/browser/zh.mjs +288 -0
  35. package/es/locale/index.mjs +141 -0
  36. package/es/locale/index.ts +196 -0
  37. package/es/locale/lang/en.mjs +282 -0
  38. package/es/locale/lang/en.ts +282 -0
  39. package/es/locale/lang/zh-cn.mjs +282 -0
  40. package/es/locale/lang/zh-cn.ts +282 -0
  41. package/es/locale/lang/zh.mjs +282 -0
  42. package/es/locale/lang/zh.ts +282 -0
  43. package/es/packages/core/common/event.mjs +58 -0
  44. package/es/packages/core/common/event.ts +56 -0
  45. package/es/packages/core/common/init.mjs +134 -0
  46. package/es/packages/core/common/init.ts +133 -0
  47. package/es/packages/core/common/props.mjs +239 -0
  48. package/es/packages/core/common/props.ts +240 -0
  49. package/es/packages/core/components/dialog-form/index.mjs +29 -0
  50. package/es/packages/core/components/dialog-form/index.ts +29 -0
  51. package/es/packages/core/components/dialog-form/index.vue +108 -0
  52. package/es/packages/core/components/form/custom.mjs +41 -0
  53. package/es/packages/core/components/form/custom.ts +41 -0
  54. package/es/packages/core/components/form/index.vue +176 -0
  55. package/es/packages/core/components/icon/index.vue +37 -0
  56. package/es/packages/core/components/image-preview/index.mjs +34 -0
  57. package/es/packages/core/components/image-preview/index.ts +37 -0
  58. package/es/packages/core/components/image-preview/index.vue +215 -0
  59. package/es/packages/core/directive/contextmenu.mjs +92 -0
  60. package/es/packages/core/directive/contextmenu.ts +103 -0
  61. package/es/packages/core/directive/permission.mjs +19 -0
  62. package/es/packages/core/directive/permission.ts +18 -0
  63. package/es/packages/data/box/index.vue +66 -0
  64. package/es/packages/data/card/index.vue +62 -0
  65. package/es/packages/data/cardText/index.vue +56 -0
  66. package/es/packages/data/countdown/index.vue +81 -0
  67. package/es/packages/data/dashboard/index.vue +72 -0
  68. package/es/packages/data/display/index.vue +63 -0
  69. package/es/packages/data/icons/index.vue +68 -0
  70. package/es/packages/data/imgText/index.vue +72 -0
  71. package/es/packages/data/list/index.vue +69 -0
  72. package/es/packages/data/notice/index.vue +63 -0
  73. package/es/packages/data/operaText/index.vue +62 -0
  74. package/es/packages/data/panel/index.vue +62 -0
  75. package/es/packages/data/pay/index.vue +92 -0
  76. package/es/packages/data/price/index.vue +55 -0
  77. package/es/packages/data/product/index.vue +106 -0
  78. package/es/packages/data/profile/index.vue +91 -0
  79. package/es/packages/data/progress/index.vue +64 -0
  80. package/es/packages/data/rank/index.vue +92 -0
  81. package/es/packages/data/rotate/index.vue +69 -0
  82. package/es/packages/data/statistic/index.vue +71 -0
  83. package/es/packages/data/tabs/index.vue +64 -0
  84. package/es/packages/data/task/index.vue +82 -0
  85. package/es/packages/data/weather/index.vue +103 -0
  86. package/es/packages/element-plus/array/index.vue +115 -0
  87. package/es/packages/element-plus/article/index.vue +73 -0
  88. package/es/packages/element-plus/card/index.vue +103 -0
  89. package/es/packages/element-plus/cascader/index.vue +132 -0
  90. package/es/packages/element-plus/chat/index.vue +513 -0
  91. package/es/packages/element-plus/checkbox/index.vue +84 -0
  92. package/es/packages/element-plus/comment/index.vue +76 -0
  93. package/es/packages/element-plus/count-up/index.vue +109 -0
  94. package/es/packages/element-plus/crud/column/column-default.vue +128 -0
  95. package/es/packages/element-plus/crud/column/column-dynamic.vue +86 -0
  96. package/es/packages/element-plus/crud/column/column-menu.vue +267 -0
  97. package/es/packages/element-plus/crud/column/column-slot.vue +348 -0
  98. package/es/packages/element-plus/crud/column/column.vue +119 -0
  99. package/es/packages/element-plus/crud/column/menu.vue +78 -0
  100. package/es/packages/element-plus/crud/config.mjs +74 -0
  101. package/es/packages/element-plus/crud/config.ts +74 -0
  102. package/es/packages/element-plus/crud/dialog/dialog-column.vue +102 -0
  103. package/es/packages/element-plus/crud/dialog/dialog-excel.vue +204 -0
  104. package/es/packages/element-plus/crud/dialog/dialog-filter.vue +159 -0
  105. package/es/packages/element-plus/crud/dialog/dialog-form.vue +352 -0
  106. package/es/packages/element-plus/crud/grid/index.vue +271 -0
  107. package/es/packages/element-plus/crud/grid/item.vue +39 -0
  108. package/es/packages/element-plus/crud/index.vue +1018 -0
  109. package/es/packages/element-plus/crud/menu/header-menu.vue +175 -0
  110. package/es/packages/element-plus/crud/menu/header-search.vue +228 -0
  111. package/es/packages/element-plus/crud/menu/table-page.vue +108 -0
  112. package/es/packages/element-plus/date/index.vue +81 -0
  113. package/es/packages/element-plus/draggable/index.vue +444 -0
  114. package/es/packages/element-plus/dynamic/index.vue +353 -0
  115. package/es/packages/element-plus/flow/index.vue +339 -0
  116. package/es/packages/element-plus/flow/node.vue +84 -0
  117. package/es/packages/element-plus/form/config.mjs +6 -0
  118. package/es/packages/element-plus/form/config.ts +6 -0
  119. package/es/packages/element-plus/form/index.vue +954 -0
  120. package/es/packages/element-plus/form/menu.vue +63 -0
  121. package/es/packages/element-plus/group/index.vue +90 -0
  122. package/es/packages/element-plus/input/index.vue +1264 -0
  123. package/es/packages/element-plus/input-color/index.vue +70 -0
  124. package/es/packages/element-plus/input-cron/index.vue +363 -0
  125. package/es/packages/element-plus/input-icon/index.vue +143 -0
  126. package/es/packages/element-plus/input-map/index.vue +311 -0
  127. package/es/packages/element-plus/input-number/index.vue +91 -0
  128. package/es/packages/element-plus/input-table/index.vue +279 -0
  129. package/es/packages/element-plus/input-tag/index.vue +79 -0
  130. package/es/packages/element-plus/input-tree/index.vue +194 -0
  131. package/es/packages/element-plus/license/index.vue +155 -0
  132. package/es/packages/element-plus/login/index.vue +203 -0
  133. package/es/packages/element-plus/mention/index.vue +117 -0
  134. package/es/packages/element-plus/radio/index.vue +38 -0
  135. package/es/packages/element-plus/rate/index.vue +51 -0
  136. package/es/packages/element-plus/search/index.vue +129 -0
  137. package/es/packages/element-plus/select/index.vue +292 -0
  138. package/es/packages/element-plus/sign/index.vue +230 -0
  139. package/es/packages/element-plus/slider/index.vue +66 -0
  140. package/es/packages/element-plus/switch/index.vue +72 -0
  141. package/es/packages/element-plus/tabs/index.vue +62 -0
  142. package/es/packages/element-plus/text-ellipsis/index.vue +104 -0
  143. package/es/packages/element-plus/time/index.vue +81 -0
  144. package/es/packages/element-plus/title/index.vue +30 -0
  145. package/es/packages/element-plus/tree/index.vue +460 -0
  146. package/es/packages/element-plus/upload/index.vue +728 -0
  147. package/es/packages/element-plus/verify/index.vue +62 -0
  148. package/es/packages/element-plus/video/index.vue +90 -0
  149. package/es/plugin/ali/index.mjs +4 -0
  150. package/es/plugin/ali/index.ts +6 -0
  151. package/es/plugin/clipboard/index.mjs +61 -0
  152. package/es/plugin/clipboard/index.ts +67 -0
  153. package/es/plugin/export/_blob.mjs +151 -0
  154. package/es/plugin/export/_blob.ts +176 -0
  155. package/es/plugin/export/_export2Excel.mjs +141 -0
  156. package/es/plugin/export/_export2Excel.ts +166 -0
  157. package/es/plugin/export/index.mjs +263 -0
  158. package/es/plugin/export/index.ts +274 -0
  159. package/es/plugin/logs/index.mjs +46 -0
  160. package/es/plugin/logs/index.ts +66 -0
  161. package/es/plugin/print/index.mjs +145 -0
  162. package/es/plugin/print/index.ts +155 -0
  163. package/es/plugin/qiniu/index.mjs +78 -0
  164. package/es/plugin/qiniu/index.ts +88 -0
  165. package/es/plugin/screenshot/index.mjs +8 -0
  166. package/es/plugin/screenshot/index.ts +9 -0
  167. package/es/plugin/video/index.mjs +52 -0
  168. package/es/plugin/video/index.ts +60 -0
  169. package/es/plugin/watermark/index.mjs +114 -0
  170. package/es/plugin/watermark/index.ts +127 -0
  171. package/es/plugin/watermark/watermark.mjs +109 -0
  172. package/es/plugin/watermark/watermark.ts +121 -0
  173. package/es/ui/data/index.mjs +49 -0
  174. package/es/ui/data/index.ts +51 -0
  175. package/es/ui/element-plus/index.mjs +87 -0
  176. package/es/ui/element-plus/index.ts +89 -0
  177. package/es/ui/index.mjs +4 -0
  178. package/es/ui/index.ts +6 -0
  179. package/es/utils/bem.mjs +29 -0
  180. package/es/utils/bem.ts +36 -0
  181. package/es/utils/mock.mjs +137 -0
  182. package/es/utils/mock.ts +151 -0
  183. package/es/utils/util.mjs +370 -0
  184. package/es/utils/util.ts +392 -0
  185. package/es/utils/validate.mjs +18 -0
  186. package/es/utils/validate.ts +23 -0
  187. package/es/version.mjs +1 -0
  188. package/es/version.ts +1 -0
  189. package/lib/avue.js +11 -35880
  190. package/lib/avue.min.js +11 -6
  191. package/lib/avue.min.ts +2 -0
  192. package/lib/avue.ts +2 -0
  193. package/lib/core/create.js +14 -0
  194. package/lib/core/create.ts +16 -0
  195. package/lib/core/dataformat.js +194 -0
  196. package/lib/core/dataformat.ts +190 -0
  197. package/lib/core/detail.js +81 -0
  198. package/lib/core/detail.ts +81 -0
  199. package/lib/core/dic.js +220 -0
  200. package/lib/core/dic.ts +235 -0
  201. package/lib/core/locale.js +10 -0
  202. package/lib/core/locale.ts +9 -0
  203. package/lib/core/packages.js +66 -0
  204. package/lib/core/packages.ts +62 -0
  205. package/lib/core/slot.js +34 -0
  206. package/lib/core/slot.ts +30 -0
  207. package/lib/global/variable.js +83 -0
  208. package/lib/global/variable.ts +84 -0
  209. package/lib/icon.js +44 -0
  210. package/lib/icon.ts +11 -0
  211. package/lib/index.js +134 -0
  212. package/lib/index.ts +177 -0
  213. package/lib/locale/browser/en.js +288 -0
  214. package/lib/locale/browser/zh-cn.js +288 -0
  215. package/lib/locale/browser/zh.js +288 -0
  216. package/lib/locale/index.js +153 -47
  217. package/lib/locale/index.ts +196 -0
  218. package/lib/locale/lang/en.js +284 -100
  219. package/lib/locale/lang/en.ts +282 -0
  220. package/lib/locale/lang/zh-cn.js +284 -0
  221. package/lib/locale/lang/zh-cn.ts +282 -0
  222. package/lib/locale/lang/zh.js +284 -100
  223. package/lib/locale/lang/zh.ts +282 -0
  224. package/lib/packages/core/common/event.js +61 -0
  225. package/lib/packages/core/common/event.ts +56 -0
  226. package/lib/packages/core/common/init.js +140 -0
  227. package/lib/packages/core/common/init.ts +133 -0
  228. package/lib/packages/core/common/props.js +245 -0
  229. package/lib/packages/core/common/props.ts +240 -0
  230. package/lib/packages/core/components/dialog-form/index.js +35 -0
  231. package/lib/packages/core/components/dialog-form/index.ts +29 -0
  232. package/lib/packages/core/components/dialog-form/index.vue +108 -0
  233. package/lib/packages/core/components/form/custom.js +43 -0
  234. package/lib/packages/core/components/form/custom.ts +41 -0
  235. package/lib/packages/core/components/form/index.vue +176 -0
  236. package/lib/packages/core/components/icon/index.vue +37 -0
  237. package/lib/packages/core/components/image-preview/index.js +40 -0
  238. package/lib/packages/core/components/image-preview/index.ts +37 -0
  239. package/lib/packages/core/components/image-preview/index.vue +215 -0
  240. package/lib/packages/core/directive/contextmenu.js +94 -0
  241. package/lib/packages/core/directive/contextmenu.ts +103 -0
  242. package/lib/packages/core/directive/permission.js +21 -0
  243. package/lib/packages/core/directive/permission.ts +18 -0
  244. package/lib/packages/data/box/index.vue +66 -0
  245. package/lib/packages/data/card/index.vue +62 -0
  246. package/lib/packages/data/cardText/index.vue +56 -0
  247. package/lib/packages/data/countdown/index.vue +81 -0
  248. package/lib/packages/data/dashboard/index.vue +72 -0
  249. package/lib/packages/data/display/index.vue +63 -0
  250. package/lib/packages/data/icons/index.vue +68 -0
  251. package/lib/packages/data/imgText/index.vue +72 -0
  252. package/lib/packages/data/list/index.vue +69 -0
  253. package/lib/packages/data/notice/index.vue +63 -0
  254. package/lib/packages/data/operaText/index.vue +62 -0
  255. package/lib/packages/data/panel/index.vue +62 -0
  256. package/lib/packages/data/pay/index.vue +92 -0
  257. package/lib/packages/data/price/index.vue +55 -0
  258. package/lib/packages/data/product/index.vue +106 -0
  259. package/lib/packages/data/profile/index.vue +91 -0
  260. package/lib/packages/data/progress/index.vue +64 -0
  261. package/lib/packages/data/rank/index.vue +92 -0
  262. package/lib/packages/data/rotate/index.vue +69 -0
  263. package/lib/packages/data/statistic/index.vue +71 -0
  264. package/lib/packages/data/tabs/index.vue +64 -0
  265. package/lib/packages/data/task/index.vue +82 -0
  266. package/lib/packages/data/weather/index.vue +103 -0
  267. package/lib/packages/element-plus/array/index.vue +115 -0
  268. package/lib/packages/element-plus/article/index.vue +73 -0
  269. package/lib/packages/element-plus/card/index.vue +103 -0
  270. package/lib/packages/element-plus/cascader/index.vue +132 -0
  271. package/lib/packages/element-plus/chat/index.vue +513 -0
  272. package/lib/packages/element-plus/checkbox/index.vue +84 -0
  273. package/lib/packages/element-plus/comment/index.vue +76 -0
  274. package/lib/packages/element-plus/count-up/index.vue +109 -0
  275. package/lib/packages/element-plus/crud/column/column-default.vue +128 -0
  276. package/lib/packages/element-plus/crud/column/column-dynamic.vue +86 -0
  277. package/lib/packages/element-plus/crud/column/column-menu.vue +267 -0
  278. package/lib/packages/element-plus/crud/column/column-slot.vue +348 -0
  279. package/lib/packages/element-plus/crud/column/column.vue +119 -0
  280. package/lib/packages/element-plus/crud/column/menu.vue +78 -0
  281. package/lib/packages/element-plus/crud/config.js +76 -0
  282. package/lib/packages/element-plus/crud/config.ts +74 -0
  283. package/lib/packages/element-plus/crud/dialog/dialog-column.vue +102 -0
  284. package/lib/packages/element-plus/crud/dialog/dialog-excel.vue +204 -0
  285. package/lib/packages/element-plus/crud/dialog/dialog-filter.vue +159 -0
  286. package/lib/packages/element-plus/crud/dialog/dialog-form.vue +352 -0
  287. package/lib/packages/element-plus/crud/grid/index.vue +271 -0
  288. package/lib/packages/element-plus/crud/grid/item.vue +39 -0
  289. package/lib/packages/element-plus/crud/index.vue +1018 -0
  290. package/lib/packages/element-plus/crud/menu/header-menu.vue +175 -0
  291. package/lib/packages/element-plus/crud/menu/header-search.vue +228 -0
  292. package/lib/packages/element-plus/crud/menu/table-page.vue +108 -0
  293. package/lib/packages/element-plus/date/index.vue +81 -0
  294. package/lib/packages/element-plus/draggable/index.vue +444 -0
  295. package/lib/packages/element-plus/dynamic/index.vue +353 -0
  296. package/lib/packages/element-plus/flow/index.vue +339 -0
  297. package/lib/packages/element-plus/flow/node.vue +84 -0
  298. package/lib/packages/element-plus/form/config.js +8 -0
  299. package/lib/packages/element-plus/form/config.ts +6 -0
  300. package/lib/packages/element-plus/form/index.vue +954 -0
  301. package/lib/packages/element-plus/form/menu.vue +63 -0
  302. package/lib/packages/element-plus/group/index.vue +90 -0
  303. package/lib/packages/element-plus/input/index.vue +1264 -0
  304. package/lib/packages/element-plus/input-color/index.vue +70 -0
  305. package/lib/packages/element-plus/input-cron/index.vue +363 -0
  306. package/lib/packages/element-plus/input-icon/index.vue +143 -0
  307. package/lib/packages/element-plus/input-map/index.vue +311 -0
  308. package/lib/packages/element-plus/input-number/index.vue +91 -0
  309. package/lib/packages/element-plus/input-table/index.vue +279 -0
  310. package/lib/packages/element-plus/input-tag/index.vue +79 -0
  311. package/lib/packages/element-plus/input-tree/index.vue +194 -0
  312. package/lib/packages/element-plus/license/index.vue +155 -0
  313. package/lib/packages/element-plus/login/index.vue +203 -0
  314. package/lib/packages/element-plus/mention/index.vue +117 -0
  315. package/lib/packages/element-plus/radio/index.vue +38 -0
  316. package/lib/packages/element-plus/rate/index.vue +51 -0
  317. package/lib/packages/element-plus/search/index.vue +129 -0
  318. package/lib/packages/element-plus/select/index.vue +292 -0
  319. package/lib/packages/element-plus/sign/index.vue +230 -0
  320. package/lib/packages/element-plus/slider/index.vue +66 -0
  321. package/lib/packages/element-plus/switch/index.vue +72 -0
  322. package/lib/packages/element-plus/tabs/index.vue +62 -0
  323. package/lib/packages/element-plus/text-ellipsis/index.vue +104 -0
  324. package/lib/packages/element-plus/time/index.vue +81 -0
  325. package/lib/packages/element-plus/title/index.vue +30 -0
  326. package/lib/packages/element-plus/tree/index.vue +460 -0
  327. package/lib/packages/element-plus/upload/index.vue +728 -0
  328. package/lib/packages/element-plus/verify/index.vue +62 -0
  329. package/lib/packages/element-plus/video/index.vue +90 -0
  330. package/lib/plugin/ali/index.js +8 -0
  331. package/lib/plugin/ali/index.ts +6 -0
  332. package/lib/plugin/clipboard/index.js +64 -0
  333. package/lib/plugin/clipboard/index.ts +67 -0
  334. package/lib/plugin/export/_blob.js +151 -0
  335. package/lib/plugin/export/_blob.ts +176 -0
  336. package/lib/plugin/export/_export2Excel.js +145 -0
  337. package/lib/plugin/export/_export2Excel.ts +166 -0
  338. package/lib/plugin/export/index.js +268 -0
  339. package/lib/plugin/export/index.ts +274 -0
  340. package/lib/plugin/logs/index.js +48 -0
  341. package/lib/plugin/logs/index.ts +66 -0
  342. package/lib/plugin/print/index.js +147 -0
  343. package/lib/plugin/print/index.ts +155 -0
  344. package/lib/plugin/qiniu/index.js +82 -0
  345. package/lib/plugin/qiniu/index.ts +88 -0
  346. package/lib/plugin/screenshot/index.js +14 -0
  347. package/lib/plugin/screenshot/index.ts +9 -0
  348. package/lib/plugin/video/index.js +55 -0
  349. package/lib/plugin/video/index.ts +60 -0
  350. package/lib/plugin/watermark/index.js +121 -0
  351. package/lib/plugin/watermark/index.ts +127 -0
  352. package/lib/plugin/watermark/watermark.js +111 -0
  353. package/lib/plugin/watermark/watermark.ts +121 -0
  354. package/lib/ui/data/index.js +54 -0
  355. package/lib/ui/data/index.ts +51 -0
  356. package/lib/ui/element-plus/index.js +92 -0
  357. package/lib/ui/element-plus/index.ts +89 -0
  358. package/lib/ui/index.js +9 -0
  359. package/lib/ui/index.ts +6 -0
  360. package/lib/utils/bem.js +31 -0
  361. package/lib/utils/bem.ts +36 -0
  362. package/lib/utils/mock.js +142 -0
  363. package/lib/utils/mock.ts +151 -0
  364. package/lib/utils/util.js +403 -0
  365. package/lib/utils/util.ts +392 -0
  366. package/lib/utils/validate.js +21 -0
  367. package/lib/utils/validate.ts +23 -0
  368. package/lib/version.js +4 -0
  369. package/lib/version.ts +1 -0
  370. package/package.json +20 -10
  371. package/types/index.d.ts +139 -47
  372. package/types/shims-aliases.d.ts +4 -0
  373. package/lib/avue.js.map +0 -1
  374. package/lib/locale/format.js +0 -44
@@ -0,0 +1,728 @@
1
+ <template>
2
+ <el-upload
3
+ :key="reload"
4
+ :class="[
5
+ b({ list: listType == 'picture-img', disabled: disabled }),
6
+ 'avue-upload--' + listType,
7
+ ]"
8
+ @click="handleClick"
9
+ :action="action"
10
+ :on-remove="handleRemove"
11
+ :accept="acceptList"
12
+ :before-remove="beforeRemove"
13
+ :multiple="multiple"
14
+ :on-preview="handlePreview"
15
+ :limit="limit"
16
+ :http-request="httpUpload"
17
+ :drag="dragFile"
18
+ :readonly="readonly"
19
+ :directory="directory"
20
+ :show-file-list="isPictureImg ? false : showFileList"
21
+ :list-type="listTypeText"
22
+ :on-change="handleFileChange"
23
+ :on-exceed="handleExceed"
24
+ :disabled="disabled"
25
+ :file-list="fileList"
26
+ >
27
+ <template v-if="listType == 'picture-card'">
28
+ <el-icon>
29
+ <el-icon-plus />
30
+ </el-icon>
31
+ </template>
32
+ <div :class="b('avatar')" v-else-if="listType == 'picture-img'">
33
+ <el-progress
34
+ type="circle"
35
+ @mouseover="handleMouseover"
36
+ v-if="showProgress(firstFile)"
37
+ :percentage="firstFile.percentage"
38
+ ></el-progress>
39
+ <div
40
+ v-else
41
+ :element-loading-text="loadText"
42
+ v-loading.lock="firstFile.loading"
43
+ >
44
+ <template v-if="firstFile.url">
45
+ <slot v-if="$slots.default" :file="firstFile"></slot>
46
+ <template v-else>
47
+ <component
48
+ v-if="firstFile.type"
49
+ :src="firstFile.url"
50
+ controls="controls"
51
+ :is="firstFile.type"
52
+ @mouseover="handleMouseover"
53
+ :class="b('avatar')"
54
+ ></component>
55
+ <el-icon
56
+ v-else
57
+ @mouseover="handleMouseover"
58
+ :src="firstFile.url"
59
+ :class="b('avatar')"
60
+ >
61
+ <el-icon-document />
62
+ </el-icon>
63
+ </template>
64
+ </template>
65
+ <el-icon v-else :class="b('avatar')">
66
+ <el-icon-plus />
67
+ </el-icon>
68
+ </div>
69
+ <div
70
+ class="el-upload-list__item-actions"
71
+ :class="b('menu')"
72
+ v-if="menu"
73
+ @mouseover="handleMouseover"
74
+ @mouseout="handleMouseout"
75
+ @click.stop="
76
+ () => {
77
+ return false;
78
+ }
79
+ "
80
+ >
81
+ <el-icon @click.stop="handlePreview(firstFile)">
82
+ <el-icon-zoom-in />
83
+ </el-icon>
84
+ <el-icon v-if="!disabled" @click.stop="handleRemove(firstFile)">
85
+ <el-icon-delete />
86
+ </el-icon>
87
+ </div>
88
+ </div>
89
+ <template v-else-if="dragFile">
90
+ <el-icon>
91
+ <el-icon-upload />
92
+ </el-icon>
93
+ <div class="el-upload__text">
94
+ <em>{{ fileText || t("upload.upload") }}</em>
95
+ </div>
96
+ </template>
97
+ <template v-else>
98
+ <slot name="button" :disabled="disabled" v-if="$slots.button"></slot>
99
+ <el-button
100
+ v-else
101
+ icon="el-icon-upload"
102
+ :size="size"
103
+ :disabled="disabled"
104
+ type="primary"
105
+ >{{ fileText || t("upload.upload") }}</el-button
106
+ >
107
+ </template>
108
+ <template #tip>
109
+ <div class="el-upload__tip" v-html="tip"></div>
110
+ </template>
111
+ <template #file="{ file }">
112
+ <span :element-loading-text="loadText" v-loading.lock="file.loading">
113
+ <template v-if="listType === 'picture-card'">
114
+ <el-progress
115
+ type="circle"
116
+ :percentage="file.percentage"
117
+ v-if="showProgress(file)"
118
+ ></el-progress>
119
+ <template v-else>
120
+ <slot :file="file" v-if="$slots.default"> </slot>
121
+ <template v-else>
122
+ <component
123
+ class="el-upload-list__item-thumbnail"
124
+ v-if="file.type"
125
+ :src="file.url"
126
+ :is="file.type"
127
+ ></component>
128
+ <el-icon v-else :class="b('avatar')">
129
+ <el-icon-document />
130
+ </el-icon>
131
+ </template>
132
+ </template>
133
+ <span class="el-upload-list__item-actions">
134
+ <span class="el-upload-list__item-preview">
135
+ <el-icon>
136
+ <el-icon-zoom-in
137
+ @click.stop="handlePreview(file)"
138
+ ></el-icon-zoom-in>
139
+ </el-icon>
140
+ </span>
141
+ <span class="el-upload-list__item-delete" v-if="!disabled">
142
+ <el-icon>
143
+ <el-icon-delete
144
+ @click.stop="handleRemove(file)"
145
+ ></el-icon-delete>
146
+ </el-icon>
147
+ </span>
148
+ </span>
149
+ </template>
150
+ <div
151
+ v-else-if="listType === 'picture'"
152
+ style="display: flex"
153
+ @click.stop="handlePreview(file)"
154
+ >
155
+ <slot :file="file" v-if="$slots.default"> </slot>
156
+ <template v-else>
157
+ <component
158
+ v-if="file.type"
159
+ class="el-upload-list__item-thumbnail"
160
+ :src="file.url"
161
+ controls="controls"
162
+ :is="file.type"
163
+ ></component>
164
+ <div class="el-upload-list__item-info">
165
+ <a class="el-upload-list__item-name">
166
+ <el-icon>
167
+ <el-icon-document></el-icon-document>
168
+ </el-icon>
169
+ <span class="el-upload-list__item-file-name">
170
+ {{ file.name }}</span
171
+ >
172
+ </a>
173
+ </div>
174
+ </template>
175
+ <el-icon class="el-icon--close" v-if="!disabled">
176
+ <el-icon-close @click.stop="handleRemove(file)"></el-icon-close>
177
+ </el-icon>
178
+ <el-progress
179
+ :class="b('progress')"
180
+ :percentage="file.percentage"
181
+ :stroke-width="3"
182
+ v-if="showProgress(file)"
183
+ ></el-progress>
184
+ </div>
185
+ <span v-else @click.stop="handlePreview(file)">
186
+ <div class="el-upload-list__item-info">
187
+ <a class="el-upload-list__item-name">
188
+ <slot :file="file" v-if="$slots.default"> </slot>
189
+ <template v-else>
190
+ <el-icon>
191
+ <el-icon-document></el-icon-document>
192
+ </el-icon>
193
+ <span class="el-upload-list__item-file-name">
194
+ {{ file.name }}</span
195
+ >
196
+ </template>
197
+ </a>
198
+ <el-icon class="el-icon--close" v-if="!disabled">
199
+ <el-icon-close @click.stop="handleRemove(file)"></el-icon-close>
200
+ </el-icon>
201
+ <el-progress
202
+ :class="b('progress')"
203
+ :percentage="file.percentage"
204
+ :stroke-width="3"
205
+ v-if="showProgress(file)"
206
+ ></el-progress>
207
+ </div>
208
+ </span>
209
+ </span>
210
+ </template>
211
+ </el-upload>
212
+ </template>
213
+
214
+ <script>
215
+ import create from "../../../core/create.mjs";
216
+ import locale from "../../../core/locale.mjs";
217
+ import props from "../../core/common/props.mjs";
218
+ import event from "../../core/common/event.mjs";
219
+ import { getAsVal, isMediaType } from "../../../utils/util.mjs";
220
+ import { detailImg } from "../../../plugin/watermark/index.mjs";
221
+ import { getToken } from "../../../plugin/qiniu/index.mjs";
222
+ import { getClient } from "../../../plugin/ali/index.mjs";
223
+ import packages from "../../../core/packages.mjs";
224
+ function getFileUrl(home, uri = "") {
225
+ return uri.match(/(^http:\/\/|^https:\/\/|^\/\/|data:image\/)/)
226
+ ? uri
227
+ : home + uri;
228
+ }
229
+ const FILE_STATUS_READY = "ready";
230
+ const FILE_STATUS_DONE = "done";
231
+ function isFileReady(file) {
232
+ return file.status === FILE_STATUS_READY;
233
+ }
234
+ export default create({
235
+ name: "upload",
236
+ mixins: [props(), event(), locale],
237
+ data() {
238
+ return {
239
+ uploadCacheList: [],
240
+ uploadList: [],
241
+ res: "",
242
+ menu: false,
243
+ reload: Math.random(),
244
+ };
245
+ },
246
+ props: {
247
+ qiniu: Object,
248
+ ali: Object,
249
+ data: {
250
+ type: Object,
251
+ default: () => {
252
+ return {};
253
+ },
254
+ },
255
+ paramsList: {
256
+ type: Array,
257
+ default: () => {
258
+ return [];
259
+ },
260
+ },
261
+ showFileList: {
262
+ type: Boolean,
263
+ default: true,
264
+ },
265
+ fileText: String,
266
+ fileType: {
267
+ type: String,
268
+ },
269
+ oss: {
270
+ type: String,
271
+ },
272
+ limit: {
273
+ type: Number,
274
+ },
275
+ headers: {
276
+ type: Object,
277
+ default: () => {
278
+ return {};
279
+ },
280
+ },
281
+ accept: {
282
+ type: [String, Array],
283
+ default: "",
284
+ },
285
+ canvasOption: {
286
+ type: Object,
287
+ default: () => {
288
+ return {};
289
+ },
290
+ },
291
+ cropperOption: {
292
+ type: Object,
293
+ default: () => {
294
+ return {};
295
+ },
296
+ },
297
+ fileSize: {
298
+ type: Number,
299
+ },
300
+ dragFile: {
301
+ type: Boolean,
302
+ default: false,
303
+ },
304
+ drag: {
305
+ type: Boolean,
306
+ default: false,
307
+ },
308
+ directory: {
309
+ type: Boolean,
310
+ default: false,
311
+ },
312
+ loadText: {
313
+ type: String,
314
+ default: "Loading...",
315
+ },
316
+ action: {
317
+ type: String,
318
+ default: "",
319
+ },
320
+ uploadSized: Function,
321
+ uploadBefore: Function,
322
+ uploadAfter: Function,
323
+ uploadDelete: Function,
324
+ uploadPreview: Function,
325
+ uploadError: Function,
326
+ uploadExceed: Function,
327
+ httpRequest: Function,
328
+ },
329
+ computed: {
330
+ listTypeText() {
331
+ if (this.listType == "picture-img" || this.listType == "") {
332
+ return "text";
333
+ }
334
+ return this.listType;
335
+ },
336
+ isObject() {
337
+ let obj = this.text[0];
338
+ return (
339
+ typeof obj === "object" || this.dataType == "object" || this.isJson
340
+ );
341
+ },
342
+ acceptList() {
343
+ if (Array.isArray(this.accept)) {
344
+ return this.accept.join(",");
345
+ }
346
+ return this.accept;
347
+ },
348
+ homeUrl() {
349
+ return this.propsHttp.home || "";
350
+ },
351
+ fileName() {
352
+ return this.propsHttp.fileName || "file";
353
+ },
354
+ isCosOss() {
355
+ return this.oss === "cos";
356
+ },
357
+ isAliOss() {
358
+ return this.oss === "ali";
359
+ },
360
+ isQiniuOss() {
361
+ return this.oss === "qiniu";
362
+ },
363
+ isPictureImg() {
364
+ return this.listType === "picture-img";
365
+ },
366
+ firstFile() {
367
+ return this.fileList[0] || {};
368
+ },
369
+ fileList() {
370
+ let list = [];
371
+ const parseFile = (ele) => {
372
+ let name, url, type;
373
+ if (this.isObject) {
374
+ name = ele[this.labelKey];
375
+ url = ele[this.valueKey];
376
+ type = ele[this.typeKey] || this.isMediaType(url);
377
+ } else {
378
+ name = ele.substring(ele.lastIndexOf("/") + 1);
379
+ url = ele;
380
+ type = this.isMediaType(url);
381
+ }
382
+ url = getFileUrl(this.homeUrl, url);
383
+ return { name, url, type };
384
+ };
385
+ this.text.forEach((ele, index) => {
386
+ if (ele) {
387
+ const { name, url, type } = parseFile(ele);
388
+ list.push({
389
+ uid: index + "",
390
+ status: FILE_STATUS_DONE,
391
+ type: type,
392
+ name: name,
393
+ url: url,
394
+ });
395
+ }
396
+ });
397
+ return list.concat(this.uploadList);
398
+ },
399
+ },
400
+ mounted() {
401
+ if (this.drag) {
402
+ this.setSort();
403
+ }
404
+ },
405
+ methods: {
406
+ handleMouseover() {
407
+ this.menu = true;
408
+ },
409
+ handleMouseout() {
410
+ this.menu = false;
411
+ },
412
+ showProgress(file) {
413
+ return isFileReady(file) && !this.oss;
414
+ },
415
+ isMediaType(url) {
416
+ return isMediaType(url, this.fileType);
417
+ },
418
+ setSort() {
419
+ if (!window.Sortable) {
420
+ packages.logs("Sortable");
421
+ return;
422
+ }
423
+ const el = this.$el.querySelectorAll(".avue-upload > ul")[0];
424
+ window.Sortable.create(el, {
425
+ animation: 100,
426
+ onEnd: (evt) => {
427
+ const targetRow = this.text.splice(evt.oldIndex, 1)[0];
428
+ this.text.splice(evt.newIndex, 0, targetRow);
429
+
430
+ this.reload = Math.random();
431
+ this.$nextTick(() => this.setSort());
432
+ },
433
+ });
434
+ },
435
+ handleError(error) {
436
+ if (error) this.uploadError && this.uploadError(error, this.column);
437
+ },
438
+ handleSuccess(file) {
439
+ if (this.isObject) {
440
+ const obj = {
441
+ [this.labelKey]: file[this.nameKey],
442
+ [this.valueKey]: file[this.urlKey],
443
+ [this.typeKey]: file[this.fileTypeKey],
444
+ };
445
+ this.paramsList.forEach((ele) => (obj[ele.label] = file[ele.value]));
446
+ this.text.push(obj);
447
+ } else {
448
+ this.text.push(file[this.urlKey]);
449
+ }
450
+ },
451
+ handleRemove(file) {
452
+ if (isFileReady(file)) {
453
+ let index = this.uploadList.findIndex((ele) => ele.raw == file);
454
+ this.uploadList.splice(index, 1);
455
+ } else {
456
+ this.beforeRemove(file).then(() => {
457
+ this.text.forEach((ele, index) => {
458
+ let url = this.isObject ? ele[this.valueKey] : ele;
459
+ if (getFileUrl(this.homeUrl, url) === file.url) {
460
+ this.text.splice(index, 1);
461
+ }
462
+ });
463
+ this.menu = false;
464
+ });
465
+ }
466
+ },
467
+ handleFileChange(file, fileList) {
468
+ fileList.pop();
469
+ this.uploadCacheList.push(file);
470
+ },
471
+ httpUpload(config) {
472
+ let { file } = config;
473
+ let fileIndex = this.uploadCacheList.findIndex((ele) => ele.raw === file);
474
+ let fileState = this.uploadCacheList[fileIndex] || {};
475
+ const deleteUploadCacheFile = () => {
476
+ const cacheIndex = this.uploadCacheList.findIndex(
477
+ (ele) => ele.raw === file
478
+ );
479
+ const index = this.uploadList.findIndex((ele) => ele.raw === file);
480
+ if (cacheIndex !== -1) this.uploadCacheList.splice(cacheIndex, 1);
481
+ if (index !== -1) this.uploadList.splice(index, 1);
482
+ };
483
+
484
+ const show = (data) => {
485
+ deleteUploadCacheFile();
486
+ this.res = data || this.res;
487
+ this.handleSuccess(this.res);
488
+ };
489
+ const hide = (msg) => {
490
+ deleteUploadCacheFile();
491
+ this.handleError(msg);
492
+ };
493
+ if (typeof this.httpRequest === "function") {
494
+ deleteUploadCacheFile();
495
+ this.httpRequest(config, this.column);
496
+ return;
497
+ }
498
+ const fileSize = file.size / 1024;
499
+ if (!this.validatenull(fileSize) && fileSize > this.fileSize) {
500
+ deleteUploadCacheFile();
501
+ this.handleSized(file, this.text);
502
+ return;
503
+ }
504
+ const headers = {
505
+ ...this.headers,
506
+ "Content-Type": "multipart/form-data",
507
+ };
508
+ //oss配置属性
509
+ let oss,
510
+ oss_config = {};
511
+ let client = {};
512
+ let param = new FormData();
513
+ const done = () => {
514
+ this.oss ? (fileState.loading = true) : (fileState.percentage = 0);
515
+ let url = this.action;
516
+ //附加属性
517
+ for (let o in this.data) {
518
+ param.append(o, this.data[o]);
519
+ }
520
+ let uploadFile;
521
+ const handleUploadResult = (res) => {
522
+ this.res = {};
523
+ if (this.isQiniuOss) {
524
+ let key = res.data.key;
525
+ res.data.url = oss_config.url + key;
526
+ res.data.name = key;
527
+ }
528
+ this.res = getAsVal(this.isAliOss ? res : res.data, this.resKey);
529
+ if (typeof this.uploadAfter === "function") {
530
+ this.uploadAfter(this.res, show, hide, this.column);
531
+ } else {
532
+ show();
533
+ }
534
+ };
535
+
536
+ const handleUploadError = (error) => {
537
+ hide(error);
538
+ };
539
+
540
+ const uploadToDefault = () => {
541
+ let timer = null;
542
+ this.$axios({
543
+ url,
544
+ method: "post",
545
+ data: param,
546
+ headers,
547
+ onUploadProgress: (progressEvent) => {
548
+ let complete =
549
+ (progressEvent.loaded / progressEvent.total) * 100 || 0;
550
+ if (complete >= 80) {
551
+ if (timer) return;
552
+ timer = setInterval(() => {
553
+ complete += (100 - complete) * 0.2;
554
+ if (fileState)
555
+ fileState.percentage = parseFloat(complete.toFixed(2));
556
+ if (complete > 99) {
557
+ timer && clearInterval(timer);
558
+ }
559
+ }, 1000);
560
+ } else {
561
+ if (fileState)
562
+ fileState.percentage = parseFloat(complete.toFixed(2));
563
+ }
564
+ },
565
+ })
566
+ .then(handleUploadResult)
567
+ .catch(handleUploadError);
568
+ };
569
+
570
+ const uploadToCos = () => {
571
+ if (!window.COS) {
572
+ packages.logs("COS");
573
+ hide();
574
+ return;
575
+ }
576
+ oss_config = this.cos || this.$AVUE.cos;
577
+ oss = new COS({
578
+ SecretId: oss_config.SecretId,
579
+ SecretKey: oss_config.SecretKey,
580
+ });
581
+
582
+ oss.uploadFile(
583
+ {
584
+ Bucket: oss_config.Bucket,
585
+ Region: oss_config.Region,
586
+ Key: uploadFile.name,
587
+ Body: uploadFile,
588
+ },
589
+ function (err, data) {
590
+ if (err) {
591
+ handleUploadError(err);
592
+ } else {
593
+ handleUploadResult({
594
+ data: {
595
+ name: data.ETag,
596
+ url: location.protocol + "//" + data.Location,
597
+ },
598
+ });
599
+ }
600
+ }
601
+ );
602
+ };
603
+
604
+ const uploadToQiniu = () => {
605
+ if (!window.CryptoJS) {
606
+ packages.logs("CryptoJS");
607
+ hide();
608
+ return;
609
+ }
610
+ oss_config = this.qiniu || this.$AVUE.qiniu;
611
+ const token = getToken(oss_config.AK, oss_config.SK, {
612
+ scope: oss_config.scope,
613
+ deadline: new Date().getTime() + oss_config.deadline * 3600,
614
+ });
615
+ param.append("token", token);
616
+ url = oss_config.bucket;
617
+ uploadToDefault();
618
+ };
619
+ const uploadToAliOss = () => {
620
+ if (!window.OSS) {
621
+ packages.logs("AliOSS");
622
+ hide();
623
+ return;
624
+ }
625
+ oss_config = this.ali || this.$AVUE.ali;
626
+ client = getClient(oss_config);
627
+
628
+ client
629
+ .put(uploadFile.name, uploadFile, {
630
+ headers: this.headers,
631
+ })
632
+ .then(handleUploadResult)
633
+ .catch(handleUploadError);
634
+ };
635
+ const callback = (newFile) => {
636
+ fileIndex = this.uploadCacheList.findIndex((ele) => ele.raw === file);
637
+ if (fileIndex !== -1) {
638
+ let list = this.uploadCacheList.splice(fileIndex, 1);
639
+ this.uploadList = this.uploadList.concat(list);
640
+ }
641
+ uploadFile = newFile || file;
642
+ param.append(this.fileName, uploadFile);
643
+ if (this.isCosOss) {
644
+ uploadToCos();
645
+ } else if (this.isQiniuOss) {
646
+ uploadToQiniu();
647
+ } else if (this.isAliOss) {
648
+ uploadToAliOss();
649
+ } else {
650
+ uploadToDefault();
651
+ }
652
+ };
653
+ if (typeof this.uploadBefore === "function") {
654
+ this.uploadBefore(file, callback, hide, this.column);
655
+ } else {
656
+ callback();
657
+ }
658
+ };
659
+ if (isMediaType(file.name) != "img") {
660
+ done();
661
+ } else {
662
+ //处理水印图片
663
+ const canvasDone = () => {
664
+ if (!this.validatenull(this.canvasOption)) {
665
+ detailImg(file, this.canvasOption).then((res) => {
666
+ file = res;
667
+ done();
668
+ });
669
+ } else {
670
+ done();
671
+ }
672
+ };
673
+ //处理图片剪裁
674
+ const canvasCrop = () => {
675
+ fileToBase64(file, (res) => {
676
+ let option = Object.assign(this.cropperOption, {
677
+ img: res,
678
+ type: "file",
679
+ callback: (res) => {
680
+ file = res;
681
+ canvasDone();
682
+ },
683
+ cancel: () => {
684
+ if (fileState) this.uploadList.splice(fileIndex, 1);
685
+ },
686
+ });
687
+ this.$ImageCropper(option);
688
+ });
689
+ };
690
+ if (!this.validatenull(this.cropperOption)) {
691
+ canvasCrop();
692
+ } else {
693
+ canvasDone();
694
+ }
695
+ }
696
+ },
697
+ handleSized(files, fileList) {
698
+ this.uploadSized &&
699
+ this.uploadSized(this.fileSize, files, fileList, this.column);
700
+ this.handleError("size");
701
+ },
702
+ handleExceed(files, fileList) {
703
+ this.uploadExceed &&
704
+ this.uploadExceed(this.limit, files, fileList, this.column);
705
+ this.handleError("exceed");
706
+ },
707
+ handlePreview(file) {
708
+ if (isFileReady(file)) return;
709
+ const callback = () => {
710
+ const index = this.fileList.findIndex((ele) => ele.url === file.url);
711
+ this.$ImagePreview(this.fileList, index);
712
+ };
713
+ if (typeof this.uploadPreview === "function") {
714
+ this.uploadPreview(file, this.column, callback);
715
+ } else {
716
+ callback();
717
+ }
718
+ },
719
+ beforeRemove(file) {
720
+ if (typeof this.uploadDelete === "function") {
721
+ return this.uploadDelete(file, this.column);
722
+ } else {
723
+ return Promise.resolve();
724
+ }
725
+ },
726
+ },
727
+ });
728
+ </script>