sh-view 1.7.5 → 2.0.0

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 (206) hide show
  1. package/.eslintrc.js +20 -21
  2. package/package.json +10 -10
  3. package/packages/assets/css/animated.scss +167 -2
  4. package/packages/assets/css/loader.scss +42 -42
  5. package/packages/assets/css/main.scss +41 -21
  6. package/packages/assets/css/theme.scss +83 -44
  7. package/packages/components/global-components/sh-alert/index.vue +173 -0
  8. package/packages/components/global-components/sh-badge/index.vue +227 -0
  9. package/packages/components/global-components/sh-card/index.vue +140 -122
  10. package/packages/components/global-components/sh-code-editor/index.vue +260 -260
  11. package/packages/components/global-components/sh-col/css/index.scss +76 -0
  12. package/packages/components/global-components/sh-col/index.vue +83 -0
  13. package/packages/components/global-components/sh-corner/index.vue +1 -9
  14. package/packages/components/global-components/sh-count-to/index.vue +102 -46
  15. package/packages/components/global-components/sh-date/index.vue +40 -0
  16. package/packages/components/global-components/sh-drawer/index.vue +518 -0
  17. package/packages/components/global-components/sh-drawer/scrollbar.js +76 -0
  18. package/packages/components/global-components/sh-empty/index.vue +43 -43
  19. package/packages/components/global-components/{sh-vxe-form → sh-form}/css/index.scss +6 -6
  20. package/packages/components/global-components/{sh-vxe-form → sh-form}/index.vue +114 -115
  21. package/packages/components/global-components/sh-form/js/methods.js +146 -0
  22. package/packages/components/global-components/{sh-vxe-form → sh-form}/mixin/defaultData.js +32 -33
  23. package/packages/components/global-components/sh-header/index.vue +293 -269
  24. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.svg +870 -0
  25. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.ttf +0 -0
  26. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff +0 -0
  27. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff2 +0 -0
  28. package/packages/components/global-components/sh-icon/css/default/icons.scss +2583 -0
  29. package/packages/components/global-components/sh-icon/css/default/index.scss +27 -0
  30. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.js +1 -0
  31. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.json +247 -0
  32. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.ttf +0 -0
  33. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff +0 -0
  34. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff2 +0 -0
  35. package/packages/components/global-components/sh-icon/css/font/icons.scss +135 -0
  36. package/packages/components/global-components/sh-icon/css/font/index.scss +16 -0
  37. package/packages/components/global-components/sh-icon/icon-default.vue +32 -0
  38. package/packages/components/global-components/sh-icon/{icons.vue → icon-font.vue} +32 -32
  39. package/packages/components/global-components/sh-icon/index.vue +28 -27
  40. package/packages/components/global-components/sh-image/index.vue +123 -0
  41. package/packages/components/global-components/sh-list/index.vue +141 -0
  42. package/packages/components/global-components/sh-loading/index.vue +49 -42
  43. package/packages/components/global-components/{sh-vxe-modal → sh-modal}/index.vue +209 -209
  44. package/packages/components/global-components/sh-noticebar/index.vue +201 -201
  45. package/packages/components/global-components/sh-poptip/index.vue +479 -0
  46. package/packages/components/global-components/sh-poptip/popper.js +115 -0
  47. package/packages/components/global-components/sh-progress/index.vue +290 -0
  48. package/packages/components/global-components/sh-pull-refresh/index.vue +290 -290
  49. package/packages/components/global-components/{sh-vxe-query → sh-query}/index.vue +317 -286
  50. package/packages/components/global-components/sh-result/index.vue +110 -88
  51. package/packages/components/global-components/sh-row/css/index.scss +21 -0
  52. package/packages/components/global-components/sh-row/index.vue +63 -0
  53. package/packages/components/global-components/sh-split/components/trigger.vue +33 -0
  54. package/packages/components/global-components/sh-split/index.vue +334 -0
  55. package/packages/components/global-components/sh-table/components/importModal.vue +351 -0
  56. package/packages/components/global-components/{sh-vxe-table → sh-table}/css/index.scss +4 -22
  57. package/packages/components/global-components/{sh-vxe-table → sh-table}/index.vue +329 -351
  58. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/methods.js +91 -153
  59. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/props.js +304 -313
  60. package/packages/components/global-components/{sh-vxe-table → sh-table}/mixin/defaultData.js +94 -116
  61. package/packages/components/global-components/sh-tabs/index.vue +315 -0
  62. package/packages/components/global-components/sh-tag/index.vue +163 -0
  63. package/packages/components/global-components/{sh-vxe-toolbar → sh-toolbar}/index.vue +177 -172
  64. package/packages/components/global-components/sh-tree/components/table-tree.vue +280 -0
  65. package/packages/components/global-components/sh-tree/css/index.scss +54 -0
  66. package/packages/components/global-components/sh-tree/index.vue +195 -0
  67. package/packages/components/global-components/sh-tree/mixin/treeProps.js +124 -0
  68. package/packages/components/global-components/sh-upload/index.vue +278 -418
  69. package/packages/components/global-components/sh-upload/js/ajax.js +80 -0
  70. package/packages/components/global-components/sh-upload/js/mixin.js +257 -0
  71. package/packages/components/global-components/sh-water-fall/index.vue +87 -87
  72. package/packages/components/index.js +85 -59
  73. package/packages/components/other-components/sh-cron-modal/css/index.scss +2 -2
  74. package/packages/components/other-components/sh-menu-card/index.vue +224 -224
  75. package/packages/css/index.js +4 -6
  76. package/packages/directive/index.js +19 -19
  77. package/packages/directive/module/click-out.js +14 -0
  78. package/packages/directive/module/draggable.js +42 -42
  79. package/packages/directive/module/line-clamp.js +22 -0
  80. package/packages/directive/module/prevent-click.js +18 -0
  81. package/packages/directive/module/resize.js +19 -0
  82. package/packages/directive/module/ripple.js +166 -0
  83. package/packages/index.js +39 -40
  84. package/packages/utils/transfer-queue.js +12 -0
  85. package/packages/vxeTable/css/index.scss +12 -98
  86. package/packages/vxeTable/css/variable.scss +7 -265
  87. package/packages/vxeTable/index.js +184 -184
  88. package/packages/vxeTable/plugins/export.js +450 -0
  89. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +36 -36
  90. package/packages/vxeTable/render/cell/vxe-render-goption.vue +94 -93
  91. package/packages/vxeTable/render/cell/vxe-render-img.vue +21 -28
  92. package/packages/vxeTable/render/cell/vxe-render-input.vue +51 -51
  93. package/packages/vxeTable/render/cell/vxe-render-progress.vue +19 -19
  94. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +36 -36
  95. package/packages/vxeTable/render/cell/vxe-render-select.vue +36 -36
  96. package/packages/vxeTable/render/cell/vxe-render-tree.vue +59 -59
  97. package/packages/vxeTable/render/globalRenders.jsx +498 -491
  98. package/packages/assets/icons/demo.css +0 -539
  99. package/packages/assets/icons/iconfont.css +0 -415
  100. package/packages/assets/icons/iconfont.js +0 -1
  101. package/packages/assets/icons/iconfont.json +0 -709
  102. package/packages/assets/icons/iconfont.ttf +0 -0
  103. package/packages/assets/icons/iconfont.woff +0 -0
  104. package/packages/assets/icons/iconfont.woff2 +0 -0
  105. package/packages/assets/img/image-error.png +0 -0
  106. package/packages/assets/img/square-image.png +0 -0
  107. package/packages/components/global-components/sh-iv-form/components/iv-group-item.vue +0 -57
  108. package/packages/components/global-components/sh-iv-form/components/iv-single-item.vue +0 -76
  109. package/packages/components/global-components/sh-iv-form/index.vue +0 -255
  110. package/packages/components/global-components/sh-layout/index.vue +0 -142
  111. package/packages/components/global-components/sh-upload/components/u-img.vue +0 -63
  112. package/packages/components/global-components/sh-upload/components/u-list.vue +0 -100
  113. package/packages/components/global-components/sh-vxe-form/js/methods.js +0 -170
  114. package/packages/components/global-components/sh-vxe-list/index.vue +0 -129
  115. package/packages/components/global-components/sh-vxe-table/components/importModal.vue +0 -377
  116. package/packages/components/global-components/sh-vxe-tree/components/table-tree.vue +0 -233
  117. package/packages/components/global-components/sh-vxe-tree/css/index.scss +0 -20
  118. package/packages/components/global-components/sh-vxe-tree/index.vue +0 -85
  119. package/packages/components/global-components/sh-vxe-tree/js/props.js +0 -120
  120. package/packages/components/global-components/sh-vxe-tree/js/treeMethods.js +0 -169
  121. package/packages/components/global-components/sh-vxe-tree/mixin/defaultData.js +0 -54
  122. package/packages/components/global-components/sh-vxe-tree/vxe-direct-tree.vue +0 -203
  123. package/packages/components/global-components/sh-vxe-tree/vxe-select-tree.vue +0 -291
  124. package/packages/components/other-components/sh-markdown/tinymce/langs/ar.js +0 -7
  125. package/packages/components/other-components/sh-markdown/tinymce/langs/az.js +0 -7
  126. package/packages/components/other-components/sh-markdown/tinymce/langs/bg_BG.js +0 -7
  127. package/packages/components/other-components/sh-markdown/tinymce/langs/bn_BD.js +0 -7
  128. package/packages/components/other-components/sh-markdown/tinymce/langs/ca.js +0 -7
  129. package/packages/components/other-components/sh-markdown/tinymce/langs/cs.js +0 -7
  130. package/packages/components/other-components/sh-markdown/tinymce/langs/cy.js +0 -7
  131. package/packages/components/other-components/sh-markdown/tinymce/langs/da.js +0 -7
  132. package/packages/components/other-components/sh-markdown/tinymce/langs/de.js +0 -7
  133. package/packages/components/other-components/sh-markdown/tinymce/langs/dv.js +0 -7
  134. package/packages/components/other-components/sh-markdown/tinymce/langs/el.js +0 -7
  135. package/packages/components/other-components/sh-markdown/tinymce/langs/eo.js +0 -7
  136. package/packages/components/other-components/sh-markdown/tinymce/langs/es.js +0 -7
  137. package/packages/components/other-components/sh-markdown/tinymce/langs/es_MX.js +0 -7
  138. package/packages/components/other-components/sh-markdown/tinymce/langs/et.js +0 -7
  139. package/packages/components/other-components/sh-markdown/tinymce/langs/eu.js +0 -7
  140. package/packages/components/other-components/sh-markdown/tinymce/langs/fa.js +0 -7
  141. package/packages/components/other-components/sh-markdown/tinymce/langs/fi.js +0 -7
  142. package/packages/components/other-components/sh-markdown/tinymce/langs/fr_FR.js +0 -7
  143. package/packages/components/other-components/sh-markdown/tinymce/langs/ga.js +0 -7
  144. package/packages/components/other-components/sh-markdown/tinymce/langs/gl.js +0 -7
  145. package/packages/components/other-components/sh-markdown/tinymce/langs/he_IL.js +0 -7
  146. package/packages/components/other-components/sh-markdown/tinymce/langs/hi.js +0 -7
  147. package/packages/components/other-components/sh-markdown/tinymce/langs/hr.js +0 -7
  148. package/packages/components/other-components/sh-markdown/tinymce/langs/hu_HU.js +0 -7
  149. package/packages/components/other-components/sh-markdown/tinymce/langs/hy.js +0 -7
  150. package/packages/components/other-components/sh-markdown/tinymce/langs/id.js +0 -7
  151. package/packages/components/other-components/sh-markdown/tinymce/langs/is_IS.js +0 -7
  152. package/packages/components/other-components/sh-markdown/tinymce/langs/it.js +0 -7
  153. package/packages/components/other-components/sh-markdown/tinymce/langs/ja.js +0 -7
  154. package/packages/components/other-components/sh-markdown/tinymce/langs/kab.js +0 -7
  155. package/packages/components/other-components/sh-markdown/tinymce/langs/kk.js +0 -7
  156. package/packages/components/other-components/sh-markdown/tinymce/langs/ko_KR.js +0 -7
  157. package/packages/components/other-components/sh-markdown/tinymce/langs/ku.js +0 -7
  158. package/packages/components/other-components/sh-markdown/tinymce/langs/lt.js +0 -7
  159. package/packages/components/other-components/sh-markdown/tinymce/langs/lv.js +0 -7
  160. package/packages/components/other-components/sh-markdown/tinymce/langs/nb_NO.js +0 -7
  161. package/packages/components/other-components/sh-markdown/tinymce/langs/ne.js +0 -7
  162. package/packages/components/other-components/sh-markdown/tinymce/langs/nl.js +0 -7
  163. package/packages/components/other-components/sh-markdown/tinymce/langs/nl_BE.js +0 -7
  164. package/packages/components/other-components/sh-markdown/tinymce/langs/oc.js +0 -7
  165. package/packages/components/other-components/sh-markdown/tinymce/langs/pl.js +0 -7
  166. package/packages/components/other-components/sh-markdown/tinymce/langs/pt_BR.js +0 -7
  167. package/packages/components/other-components/sh-markdown/tinymce/langs/ro.js +0 -7
  168. package/packages/components/other-components/sh-markdown/tinymce/langs/ru.js +0 -7
  169. package/packages/components/other-components/sh-markdown/tinymce/langs/sk.js +0 -7
  170. package/packages/components/other-components/sh-markdown/tinymce/langs/sl_SI.js +0 -7
  171. package/packages/components/other-components/sh-markdown/tinymce/langs/sq.js +0 -7
  172. package/packages/components/other-components/sh-markdown/tinymce/langs/sr.js +0 -7
  173. package/packages/components/other-components/sh-markdown/tinymce/langs/sv_SE.js +0 -7
  174. package/packages/components/other-components/sh-markdown/tinymce/langs/ta.js +0 -7
  175. package/packages/components/other-components/sh-markdown/tinymce/langs/tg.js +0 -7
  176. package/packages/components/other-components/sh-markdown/tinymce/langs/th_TH.js +0 -7
  177. package/packages/components/other-components/sh-markdown/tinymce/langs/tr.js +0 -7
  178. package/packages/components/other-components/sh-markdown/tinymce/langs/ug.js +0 -7
  179. package/packages/components/other-components/sh-markdown/tinymce/langs/uk.js +0 -7
  180. package/packages/components/other-components/sh-markdown/tinymce/langs/vi.js +0 -7
  181. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.css +0 -72
  182. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.min.css +0 -7
  183. package/packages/components/other-components/sh-markdown/tinymce/skins/content/default/content.min.css +0 -7
  184. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.css +0 -72
  185. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.min.css +0 -7
  186. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.css +0 -68
  187. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.min.css +0 -7
  188. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.css +0 -714
  189. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.css +0 -726
  190. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.min.css +0 -7
  191. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.min.css +0 -7
  192. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.css +0 -29
  193. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.min.css +0 -7
  194. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  195. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.css +0 -3047
  196. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.min.css +0 -7
  197. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.css +0 -673
  198. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +0 -7
  199. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +0 -37
  200. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +0 -7
  201. package/packages/directive/directives.js +0 -27
  202. package/packages/iview/css/index.scss +0 -32
  203. package/packages/iview/index.js +0 -25
  204. /package/packages/components/global-components/{sh-vxe-form → sh-form}/components/form-item.vue +0 -0
  205. /package/packages/components/global-components/{sh-vxe-form → sh-form}/js/props.js +0 -0
  206. /package/packages/components/global-components/{sh-vxe-table → sh-table}/js/excel_to_json.js +0 -0
@@ -1,418 +1,278 @@
1
- <template>
2
- <div class="sh-upload" :class="upClass">
3
- <u-list
4
- v-if="listType === 'card'"
5
- :upload-list="uploadList"
6
- :list-type="listType"
7
- :type="type"
8
- :is-form-data="isFormData"
9
- :disabled="disabled"
10
- :preview="preview"
11
- :up-styles="upStyles"
12
- :up-class="upClass"
13
- @delete="handleFileRemove"></u-list>
14
- <div v-show="uploadList.length < limit" class="sh-upload-list" :style="upStyles" :class="upClass">
15
- <Upload
16
- ref="upload"
17
- class="upload-box-component"
18
- :class="upClass"
19
- :action="action"
20
- :headers="headers"
21
- :disabled="disabled"
22
- :multiple="multiple"
23
- :type="uploadType"
24
- :accept="accept"
25
- :data="params"
26
- :name="inputname"
27
- :show-upload-list="false"
28
- :on-progress="uploadProgress"
29
- :on-success="uploadSuccess"
30
- :on-error="uploadError"
31
- :before-upload="handleBeforeUpload">
32
- <div v-if="uploadType === 'drag'" class="py-3">
33
- <sh-icon :type="iconType" size="26"></sh-icon>
34
- <p class="mt-1">上传附件</p>
35
- </div>
36
- <template v-else-if="listType === 'card'">
37
- <div class="upload-box-inner" :style="upStyles"><sh-icon :type="iconType" /></div>
38
- </template>
39
- <template v-else>
40
- <Button icon="ios-cloud-upload-outline">上传附件</Button>
41
- </template>
42
- </Upload>
43
- </div>
44
- <u-list
45
- v-if="listType === 'list'"
46
- :upload-list="uploadList"
47
- :width="width"
48
- :height="height"
49
- :list-type="listType"
50
- :type="type"
51
- :is-form-data="isFormData"
52
- :disabled="disabled"
53
- :preview="preview"
54
- :up-styles="upStyles"
55
- :up-class="upClass"
56
- @delete="handleFileRemove"></u-list>
57
- </div>
58
- </template>
59
-
60
- <script>
61
- import UList from './components/u-list.vue'
62
- export default {
63
- name: 'ShUpload',
64
- components: {
65
- UList
66
- },
67
- props: {
68
- isFormData: {
69
- type: Boolean,
70
- default: true
71
- },
72
- // 编辑回显数据
73
- value: {
74
- type: [Array],
75
- default() {
76
- return []
77
- }
78
- },
79
- action: {
80
- type: String,
81
- default: '-'
82
- },
83
- icon: {
84
- type: String,
85
- default: ''
86
- },
87
- headers: {
88
- type: Object,
89
- default() {
90
- return {}
91
- }
92
- },
93
- disabled: {
94
- type: Boolean
95
- },
96
- preview: {
97
- type: Boolean,
98
- default: true
99
- },
100
- width: {
101
- type: [String, Number],
102
- default: 80
103
- },
104
- height: {
105
- type: [String, Number],
106
- default: 80
107
- },
108
- limit: {
109
- type: Number,
110
- default: 1
111
- },
112
- limitBytes: {
113
- type: Number,
114
- default: 2097152
115
- },
116
- accept: {
117
- type: String,
118
- default: '.doc,.docx,.xls,.xlsx,.txt,.pdf,.jpg,.jpeg,.png,.txt,.7z,.zip,.rar'
119
- },
120
- params: {
121
- type: Object,
122
- default() {
123
- return {}
124
- }
125
- },
126
- inputname: {
127
- type: String,
128
- default: 'image'
129
- },
130
- type: {
131
- type: String,
132
- default: 'img' // img, file 上传图片还是文件
133
- },
134
- listType: {
135
- type: String,
136
- default: 'card' // card, list 附件列表展示类型
137
- },
138
- uploadType: {
139
- type: String,
140
- default: 'select' // drag
141
- },
142
- beforeUpload: {
143
- type: Function
144
- },
145
- baseUrl: {
146
- type: String,
147
- default: ''
148
- },
149
- serverConfig: {
150
- type: Object,
151
- default() {
152
- return {
153
- type: 'post',
154
- url: ''
155
- }
156
- }
157
- }
158
- },
159
- emits: ['update:modelValue', 'progress', 'success', 'error', 'file-delete'],
160
- data() {
161
- return {
162
- resultUrl: '',
163
- uploadList: []
164
- }
165
- },
166
- computed: {
167
- multiple() {
168
- return this.limit > 1
169
- },
170
- iconType() {
171
- return this.icon || (this.type === 'img' ? 'md-camera' : 'ios-folder')
172
- },
173
- upStyles() {
174
- return this.listType === 'card' ? { width: `${this.width}px`, height: `${this.height}px` } : {}
175
- },
176
- upClass() {
177
- return [
178
- {
179
- [this.listType]: true
180
- }
181
- ]
182
- },
183
- messageAll() {
184
- return {
185
- limitBytes: this.limitBytes,
186
- fileSizeError: '文件大小不能超过' + this.limitBytes / (1024 * 1024) + 'M',
187
- fileFormat: this.accept.split(','),
188
- fileTypeError: '格式不正确,请上传' + this.accept + '文件'
189
- }
190
- }
191
- },
192
- watch: {
193
- modelValue: {
194
- handler: function (val, oldVal) {
195
- if (val && Array.isArray(val)) {
196
- this.uploadList = val
197
- }
198
- },
199
- immediate: true,
200
- deep: true
201
- },
202
- uploadList: {
203
- handler: function (val, oldVal) {
204
- this.$emit('update:modelValue', val)
205
- },
206
- immediate: false,
207
- deep: true
208
- }
209
- },
210
- created() {},
211
- mounted() {},
212
- methods: {
213
- // 上传进度
214
- uploadProgress(event, file, fileList) {
215
- this.$emit('progress', event, file, fileList)
216
- },
217
- // 上传成功
218
- uploadSuccess(res, file, fileList) {
219
- this.$emit('success', res, file, fileList)
220
- },
221
- // 上传失败
222
- uploadError(error, file, fileList) {
223
- this.$emit('error', error, file, fileList)
224
- },
225
- // 文件上传前狗子
226
- handleBeforeUpload(file) {
227
- // 文件类型校验
228
- let type = file.name.substr(file.name.lastIndexOf('.')).toLowerCase() // .jpg
229
- let imgFileTypeArr = this.messageAll.fileFormat
230
- let checkType = imgFileTypeArr.some(item => {
231
- return item === type
232
- })
233
- if (this.fileaccept !== '' && !checkType) {
234
- this.msginfo(this.messageAll.fileTypeError)
235
- return false
236
- }
237
- // 文件大小校验
238
- const checkMax = file.size < this.messageAll.limitBytes
239
- if (!checkMax) {
240
- this.msginfo(this.messageAll.fileSizeError)
241
- return false
242
- }
243
- if (typeof this.beforeUpload === 'function') {
244
- this.beforeUpload(file)
245
- } else if (this.isFormData) {
246
- this.handleFilePreviewData(file)
247
- } else {
248
- this.handleFileUpload(file)
249
- }
250
- return this.action !== '-'
251
- },
252
- // 组件上传formdata进行内部预览图片
253
- handleFilePreviewData(file) {
254
- this.uploadList.push(file)
255
- },
256
- // 组件内文件上传
257
- async handleFileUpload(file) {
258
- const that = this
259
- if (!that.serverConfig.url) {
260
- that.msgerror('上传未配置请求地址!')
261
- return
262
- }
263
- if (!that.serverConfig.type) {
264
- that.msgerror('上传未配置请求方式!')
265
- return
266
- }
267
- let axiosData = new FormData()
268
- let axiosHeader = Object.assign({}, that.headers)
269
- axiosHeader['Content-Type'] = 'multipart/form-data'
270
- axiosData.append('file', file)
271
- if (that.params) {
272
- Object.keys(that.params).forEach(key => {
273
- axiosData.append(key, that.params[key])
274
- })
275
- }
276
- try {
277
- let res = await that.$http.request({
278
- method: that.serverConfig.type,
279
- url: that.serverConfig.url,
280
- headers: axiosHeader,
281
- data: axiosData
282
- })
283
- console.log(res)
284
- } catch (e) {
285
- that.msgerror('上传失败 ' + e.message || e)
286
- }
287
- },
288
- // 文件删除
289
- handleFileRemove(data) {
290
- const that = this
291
- that.msgconfirm({
292
- content: '确定要删除吗?'
293
- }).then(() => {
294
- const dataIndex = this.uploadList.indexOf(data)
295
- that.uploadList.splice(dataIndex, 1)
296
- that.$refs.upload.fileList.splice(dataIndex, 1)
297
- that.$emit('file-delete', data)
298
- })
299
- }
300
- }
301
- }
302
- </script>
303
-
304
- <style lang="scss">
305
- .sh-upload {
306
- display: inline-block;
307
- &.list {
308
- display: block;
309
- width: 100%;
310
- }
311
- .sh-upload-list {
312
- border-radius: 4px;
313
- background: var(--body-background);
314
- position: relative;
315
- &.card {
316
- display: inline-block;
317
- vertical-align: top;
318
- text-align: center;
319
- overflow: hidden;
320
- & + .sh-upload-list.card {
321
- margin-left: 4px;
322
- }
323
- }
324
- &.list {
325
- & + .sh-upload-list.list {
326
- margin-top: 8px;
327
- }
328
- }
329
- img {
330
- width: 100%;
331
- height: 100%;
332
- }
333
- .list-file-card {
334
- position: relative;
335
- height: 100%;
336
- width: 100%;
337
- display: flex;
338
- align-items: center;
339
- justify-content: center;
340
- background-color: var(--header-color);
341
- .list-file-cover {
342
- display: flex;
343
- position: absolute;
344
- top: 0;
345
- bottom: 0;
346
- left: 0;
347
- right: 0;
348
- background: rgba(0, 0, 0, 0.6);
349
- align-items: center;
350
- justify-content: center;
351
- font-size: 20px;
352
- opacity: 0;
353
- transition: 0.3s all;
354
- &:hover {
355
- opacity: 1;
356
- }
357
- i {
358
- color: #fff;
359
- font-size: 16px;
360
- cursor: pointer;
361
- margin: 0 5px;
362
- }
363
- }
364
- }
365
- .list-file-item {
366
- position: relative;
367
- display: flex;
368
- align-items: center;
369
- justify-content: space-between;
370
- padding: 5px 10px;
371
- background: var(--hover-color);
372
- height: 100%;
373
- & + .list-file-item {
374
- margin-top: 8px;
375
- }
376
- .file-title {
377
- flex: 1;
378
- margin-right: 10px;
379
- line-height: 1.2;
380
- }
381
- .file-action {
382
- display: inline-flex;
383
- flex-wrap: nowrap;
384
- .file-action-item {
385
- display: inline-block;
386
- cursor: pointer;
387
- color: var(--theme-color);
388
- margin-left: 8px;
389
- }
390
- }
391
- }
392
- .upload-box-component {
393
- border-radius: 4px;
394
- cursor: pointer;
395
- width: 100%;
396
- height: 100%;
397
- &.card {
398
- display: inline-block;
399
- vertical-align: top;
400
- border: 1px dashed var(--border-color);
401
- text-align: center;
402
- overflow: hidden;
403
- }
404
- &.list {
405
- }
406
- .upload-box-inner {
407
- font-size: 26px;
408
- display: inline-flex;
409
- align-items: center;
410
- justify-content: center;
411
- }
412
- }
413
- }
414
- .ivu-icon {
415
- font-size: inherit;
416
- }
417
- }
418
- </style>
1
+ <template>
2
+ <div class="sh-upload" :class="{ list: !card }">
3
+ <slot name="head"></slot>
4
+ <div
5
+ v-if="!disabled"
6
+ v-show="fileList.length < limit"
7
+ class="upload-component"
8
+ :class="upClass"
9
+ :style="upStyles"
10
+ @click="handleClick"
11
+ @drop.prevent="onDrop"
12
+ @paste="handlePaste"
13
+ @dragover.prevent="dragOver = true"
14
+ @dragleave.prevent="dragOver = false">
15
+ <input ref="input" type="file" class="sh-upload-input" :multiple="multiple" :webkitdirectory="webkitdirectory" :accept="accept" @change="handleChange" />
16
+ <slot>
17
+ <div class="upload-box" :class="{ drag, card }" :style="upStyles">
18
+ <sh-icon v-if="icon" class="upload-box-icon" :type="icon" :size="iconSize"></sh-icon>
19
+ <span class="upload-box-text">上传附件</span>
20
+ </div>
21
+ </slot>
22
+ </div>
23
+ <ul v-if="fileList.length" class="upload-list">
24
+ <li v-for="(file, index) in fileList" :key="index" class="upload-list-item">
25
+ <slot name="fileItem" v-bind="file">
26
+ <div class="upload-list-title" :title="file.name">{{ file.name }}</div>
27
+ <div v-if="file.status !== 'success'" class="upload-list-progress">
28
+ <sh-progress v-if="file.showProgress" v-bind="progressConfig(file)"></sh-progress>
29
+ </div>
30
+ <div v-else class="upload-list-action">
31
+ <template v-for="listAct in listActions" :key="listAct.code">
32
+ <span class="action-item" @click="onActionClick(listAct, file)"><sh-icon :type="listAct.icon" :title="listAct.title" size="18" /></span>
33
+ </template>
34
+ </div>
35
+ </slot>
36
+ </li>
37
+ </ul>
38
+ <slot name="foot"></slot>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ import mixin from './js/mixin'
44
+ export default {
45
+ name: 'ShUpload',
46
+ mixins: [mixin],
47
+ props: {
48
+ baseUrl: {
49
+ type: String,
50
+ default: ''
51
+ },
52
+ width: {
53
+ type: [String, Number],
54
+ default: 80
55
+ },
56
+ height: {
57
+ type: [String, Number],
58
+ default: 80
59
+ },
60
+ limit: {
61
+ type: Number,
62
+ default: 1
63
+ },
64
+ card: {
65
+ type: Boolean
66
+ },
67
+ drag: {
68
+ type: Boolean
69
+ },
70
+ icon: {
71
+ type: String,
72
+ default: 'ios-folder'
73
+ },
74
+ iconSize: {
75
+ type: [Number, String]
76
+ },
77
+ params: {
78
+ type: Object,
79
+ default() {
80
+ return {}
81
+ }
82
+ },
83
+ actionList: {
84
+ type: Array,
85
+ default() {
86
+ return ['detail', 'download', 'delete']
87
+ }
88
+ },
89
+ resKey: {
90
+ type: String,
91
+ default: 'data'
92
+ }
93
+ },
94
+ emits: ['update:modelValue', 'action'],
95
+ data() {
96
+ return {}
97
+ },
98
+ computed: {
99
+ multiple() {
100
+ return this.limit > 1
101
+ },
102
+ upStyles() {
103
+ return this.card ? { width: `${this.width}px`, height: `${this.height}px` } : {}
104
+ },
105
+ upClass() {
106
+ return {
107
+ 'sh-upload-list': !this.card,
108
+ 'sh-upload-select': !this.drag,
109
+ 'sh-upload-drag': this.drag,
110
+ 'sh-upload-dragOver': this.drag && this.dragOver
111
+ }
112
+ },
113
+ fileFormat() {
114
+ return this.format.length ? this.format : this.accept.split(',').map(_ => String(_).replace('.', ''))
115
+ },
116
+ listActions() {
117
+ let list = [
118
+ { title: '查看文件', icon: 'ios-eye-outline', code: 'detail' },
119
+ { title: '下载文件', icon: 'ios-download', code: 'download' }
120
+ ]
121
+ if (!this.disabled) {
122
+ list.push({ title: '删除文件', icon: 'ios-trash-outline', code: 'delete' })
123
+ }
124
+ return list.filter(item => this.actionList.includes(item.code))
125
+ }
126
+ },
127
+ methods: {
128
+ // 上传校验
129
+ validateFile(file) {
130
+ let { fileList, action, fileFormat, maxSize } = this
131
+ // check format
132
+ if (fileFormat.length) {
133
+ const _file_format = file.name.split('.').pop().toLocaleLowerCase()
134
+ const checked = fileFormat.some(item => item.toLocaleLowerCase() === _file_format)
135
+ if (!checked) {
136
+ let errorMsg = `格式不正确,请上传 ${fileFormat.join(' ')} 格式文件`
137
+ this.onFormatError ? this.onFormatError(file, errorMsg, fileList) : this.msginfo(errorMsg)
138
+ return
139
+ }
140
+ }
141
+ // check maxSize
142
+ if (maxSize && file.size > maxSize * 1024) {
143
+ let errorMsg = `文件大小不能超过 ${maxSize / 1024} M`
144
+ this.onExceededSize ? this.onExceededSize(file, errorMsg, fileList) : this.msginfo(errorMsg)
145
+ return
146
+ }
147
+ if (!action) {
148
+ this.msginfo('上传地址不能为空')
149
+ return
150
+ }
151
+ return true
152
+ },
153
+ // 附件操作点击事件
154
+ onActionClick(obj, file) {
155
+ if (obj.code === 'delete') {
156
+ this.handleRemove(file)
157
+ } else if (obj.code === 'detail') {
158
+ this.handlePreview(file)
159
+ } else if (obj.code === 'download') {
160
+ this.handleDownload(file)
161
+ }
162
+ this.$emit('action', obj)
163
+ },
164
+ // 获取双向绑定值
165
+ getModelValue() {
166
+ return this.fileList.map(item => {
167
+ let url = this.$vUtils.get(item, `response.${this.resKey}`)
168
+ return {
169
+ name: item.name,
170
+ url: url
171
+ }
172
+ })
173
+ }
174
+ }
175
+ }
176
+ </script>
177
+
178
+ <style scoped lang="scss">
179
+ .sh-upload {
180
+ display: inline-block;
181
+ vertical-align: top;
182
+ &.list {
183
+ display: block;
184
+ width: 100%;
185
+ }
186
+ .upload-component {
187
+ border: 1px solid var(--vxe-table-border-color);
188
+ background-color: var(--vxe-table-body-background-color);
189
+ border-radius: var(--vxe-border-radius);
190
+ cursor: pointer;
191
+ input[type='file'] {
192
+ display: none;
193
+ }
194
+ .upload-box {
195
+ display: inline-block;
196
+ padding: 6px 10px;
197
+ box-sizing: border-box;
198
+ .upload-box-icon {
199
+ margin-right: 5px;
200
+ }
201
+ &.card,
202
+ &.drag {
203
+ display: inline-flex;
204
+ flex-direction: column;
205
+ align-items: center;
206
+ justify-content: center;
207
+ .upload-box-icon {
208
+ margin-bottom: 8px;
209
+ }
210
+ }
211
+ &.drag {
212
+ min-height: 100px;
213
+ }
214
+ }
215
+ &:hover {
216
+ border: 1px solid var(--vxe-primary-color);
217
+ }
218
+ &.sh-upload-select {
219
+ display: inline-block;
220
+ vertical-align: top;
221
+ }
222
+ &.sh-upload-drag {
223
+ text-align: center;
224
+ cursor: pointer;
225
+ position: relative;
226
+ overflow: hidden;
227
+ &:hover {
228
+ border: 1px dashed var(--vxe-primary-color);
229
+ }
230
+ }
231
+ &.sh-upload-dragOver {
232
+ border: 2px dashed var(--vxe-primary-color);
233
+ }
234
+ }
235
+ .upload-list {
236
+ display: block;
237
+ .upload-list-item {
238
+ display: flex;
239
+ align-items: stretch;
240
+ border: 1px solid var(--vxe-table-border-color);
241
+ background-color: var(--vxe-table-body-background-color);
242
+ position: relative;
243
+ .upload-list-title {
244
+ padding: 6px 10px;
245
+ flex: 1;
246
+ display: block;
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
249
+ overflow: hidden;
250
+ }
251
+ .upload-list-action {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ color: var(--vxe-primary-color);
255
+ .action-item {
256
+ display: inline-flex;
257
+ align-items: center;
258
+ padding: 0 5px;
259
+ height: 100%;
260
+ cursor: pointer;
261
+ &:hover {
262
+ background-color: var(--vxe-primary-darken-color);
263
+ }
264
+ }
265
+ }
266
+ .upload-list-progress {
267
+ position: absolute;
268
+ left: 0;
269
+ right: 0;
270
+ top: 0;
271
+ bottom: 0;
272
+ display: flex;
273
+ align-items: center;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ </style>