bri-components 1.5.22 → 1.6.1

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 (154) hide show
  1. package/README.md +83 -83
  2. package/lib/styles/bundle.css +12 -12
  3. package/lib/styles/font/fontello.svg +31 -31
  4. package/package.json +127 -125
  5. package/src/components/Error/Error403.vue +42 -42
  6. package/src/components/Error/Error404.vue +40 -40
  7. package/src/components/Error/Error500.vue +51 -51
  8. package/src/components/Error/error.less +162 -162
  9. package/src/components/Error/errorBack.vue +40 -40
  10. package/src/components/controls/DshControlInput.vue +195 -195
  11. package/src/components/controls/base/BriUpload/BriUpload.vue +435 -434
  12. package/src/components/controls/base/BriUpload/BriUploadImage.vue +430 -377
  13. package/src/components/controls/base/BriUpload/uploadList.vue +738 -727
  14. package/src/components/controls/base/BriUpload/uploadMixin.js +453 -446
  15. package/src/components/controls/base/DshCascader/DshCascader.vue +215 -215
  16. package/src/components/controls/base/DshCascader/components/cascaderModal.vue +366 -366
  17. package/src/components/controls/base/DshCascader/components/cascaderPicker.vue +416 -416
  18. package/src/components/controls/base/DshCascader/components/cascaderSimple.vue +141 -141
  19. package/src/components/controls/base/DshCascader/components/cascaderTree.vue +151 -151
  20. package/src/components/controls/base/DshCoordinates.vue +587 -585
  21. package/src/components/controls/base/DshDate/DshDate.vue +191 -191
  22. package/src/components/controls/base/DshDate/DshDaterange.vue +186 -186
  23. package/src/components/controls/base/DshDivider.vue +201 -201
  24. package/src/components/controls/base/DshEditor.vue +274 -274
  25. package/src/components/controls/base/DshInput/BriInputs.vue +166 -166
  26. package/src/components/controls/base/DshInput/DshInput.vue +260 -260
  27. package/src/components/controls/base/DshNumber/BriInputNumber/BriInputNumber.vue +435 -435
  28. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/emitter.js +34 -34
  29. package/src/components/controls/base/DshNumber/BriInputNumber/mixins/form.js +14 -14
  30. package/src/components/controls/base/DshNumber/BriInputNumber/utils/assist.js +322 -322
  31. package/src/components/controls/base/DshNumber/DshNumber.vue +143 -143
  32. package/src/components/controls/base/DshNumber/DshNumberange.vue +109 -109
  33. package/src/components/controls/base/DshSelect/DshCheckbox.vue +168 -168
  34. package/src/components/controls/base/DshSelect/DshSelect.vue +180 -180
  35. package/src/components/controls/base/DshSelect/DshSelectAll.vue +269 -269
  36. package/src/components/controls/base/DshSwitch/DshSwitch.vue +115 -115
  37. package/src/components/controls/control.less +324 -324
  38. package/src/components/controls/controlMap.js +117 -117
  39. package/src/components/controls/extra/DshColor.vue +81 -81
  40. package/src/components/controls/extra/DshThemeColor.vue +100 -100
  41. package/src/components/controls/extra/DshThemeIcon.vue +122 -122
  42. package/src/components/controls/mixins/cascaderMixin.js +325 -325
  43. package/src/components/controls/mixins/cascaderPickerMixin.js +227 -227
  44. package/src/components/controls/mixins/cascaderTableMixin.js +130 -130
  45. package/src/components/controls/mixins/controlMixin.js +393 -393
  46. package/src/components/controls/mixins/dateMixin.js +149 -149
  47. package/src/components/controls/mixins/flatTableMixin.js +111 -111
  48. package/src/components/controls/mixins/numberMixin.js +112 -112
  49. package/src/components/controls/mixins/selectMixin.js +233 -233
  50. package/src/components/controls/mixins/switchMixin.js +87 -87
  51. package/src/components/controls/mixins/userAndDepartMixin.js +260 -260
  52. package/src/components/controls/senior/DshLabels.vue +333 -333
  53. package/src/components/controls/senior/DshPackage.vue +57 -57
  54. package/src/components/controls/senior/cascaderTable.vue +213 -213
  55. package/src/components/controls/senior/correlation.vue +135 -135
  56. package/src/components/controls/senior/flatTable.vue +138 -138
  57. package/src/components/controls/senior/selectDepartments.vue +397 -399
  58. package/src/components/controls/senior/selectUsers/departMenu.vue +296 -293
  59. package/src/components/controls/senior/selectUsers/selectUsers.vue +712 -712
  60. package/src/components/controls/special/DshBack.vue +42 -42
  61. package/src/components/controls/special/DshUndeveloped.vue +41 -41
  62. package/src/components/form/DshAdvSearch.vue +510 -510
  63. package/src/components/form/DshDefaultSearch.vue +260 -260
  64. package/src/components/form/DshForm.vue +494 -494
  65. package/src/components/form/searchMixin.js +376 -376
  66. package/src/components/list/BriCard.vue +95 -95
  67. package/src/components/list/BriTable.vue +205 -205
  68. package/src/components/list/BriTree.vue +529 -529
  69. package/src/components/list/BriTreeItem.vue +163 -163
  70. package/src/components/list/DshBox/DshBox.vue +219 -219
  71. package/src/components/list/DshBox/DshCard.vue +446 -446
  72. package/src/components/list/DshBox/DshCrossTable.vue +827 -827
  73. package/src/components/list/DshBox/DshList.vue +404 -404
  74. package/src/components/list/DshBox/DshPanel.vue +669 -669
  75. package/src/components/list/DshBox/DshSingleData.vue +119 -119
  76. package/src/components/list/DshBox/DshTable.vue +239 -239
  77. package/src/components/list/DshCascaderTable.vue +115 -115
  78. package/src/components/list/DshFlatTable.vue +334 -337
  79. package/src/components/list/DshPage.vue +194 -194
  80. package/src/components/list/DshTreeTable.vue +113 -113
  81. package/src/components/list/common/importModal.vue +243 -243
  82. package/src/components/list/common/quoteListModal.vue +206 -206
  83. package/src/components/list/mixins/DshCascaderTableMixin.js +278 -278
  84. package/src/components/list/mixins/DshFlatTableMixin.js +509 -509
  85. package/src/components/list/mixins/DshTreeTableMixin.js +286 -286
  86. package/src/components/list/mixins/tableBaseMixin.js +1653 -1653
  87. package/src/components/list/mixins/treeTableBaseMixin.js +145 -145
  88. package/src/components/other/BriAvatar.vue +166 -166
  89. package/src/components/other/BriCode.vue +125 -125
  90. package/src/components/other/BriCollapseTree.vue +207 -207
  91. package/src/components/other/BriGantt.vue +1087 -1087
  92. package/src/components/other/BriIframe.vue +116 -116
  93. package/src/components/other/BriLoading.vue +171 -171
  94. package/src/components/other/BriSvg.vue +27 -27
  95. package/src/components/other/DshColorPanel.vue +128 -128
  96. package/src/components/other/DshMenuNav.vue +188 -188
  97. package/src/components/other/DshVideoPlayer.vue +184 -0
  98. package/src/components/small/BriButton.vue +71 -71
  99. package/src/components/small/BriDrawer.vue +169 -169
  100. package/src/components/small/BriTooltip.vue +87 -87
  101. package/src/components/small/DshBtnModal.vue +68 -68
  102. package/src/components/small/DshButtons.vue +324 -324
  103. package/src/components/small/DshDropdown.vue +225 -225
  104. package/src/components/small/DshIcons.vue +59 -59
  105. package/src/components/small/DshListRender.js +21 -21
  106. package/src/components/small/DshModal.vue +160 -160
  107. package/src/components/small/DshSteps.vue +141 -141
  108. package/src/components/small/DshTabs.vue +598 -598
  109. package/src/components/small/DshTabsSet.vue +309 -309
  110. package/src/components/small/DshTags.vue +251 -251
  111. package/src/components/small/DshTitle.vue +50 -50
  112. package/src/components/small/render.js +20 -20
  113. package/src/components/unit/DshFormUnit.vue +398 -398
  114. package/src/components/unit/DshListUnit.vue +115 -115
  115. package/src/components/unit/unitMixin.js +86 -86
  116. package/src/data/index.js +4 -4
  117. package/src/index.js +287 -285
  118. package/src/styles/bundle.css +12 -12
  119. package/src/styles/components/BriButton.less +307 -307
  120. package/src/styles/components/BriTable.less +344 -344
  121. package/src/styles/components/DshModal.less +257 -257
  122. package/src/styles/components/index.less +3 -3
  123. package/src/styles/global/animate.less +11 -11
  124. package/src/styles/global/base.less +45 -45
  125. package/src/styles/global/box.less +186 -186
  126. package/src/styles/global/control.less +122 -122
  127. package/src/styles/global/flex.less +282 -282
  128. package/src/styles/global/global.less +8 -8
  129. package/src/styles/global/text.less +59 -59
  130. package/src/styles/global/variables.less +85 -85
  131. package/src/styles/iconfont/iconfont.css +254 -254
  132. package/src/styles/iconfont/iconfont.json +422 -422
  133. package/src/styles/iconfont/iconfont.svg +137 -137
  134. package/src/styles/index.less +26 -26
  135. package/src/styles/reset-easytable.less +21 -21
  136. package/src/styles/reset-iview-controls.less +145 -145
  137. package/src/styles/reset-iview-other.less +49 -49
  138. package/src/styles/reset-iview-variables.less +43 -43
  139. package/src/styles/reset.less +45 -45
  140. package/src/utils/index.js +3 -5
  141. package/lib/0.bri-components.min.js +0 -1
  142. package/lib/1.bri-components.min.js +0 -1
  143. package/lib/10.bri-components.min.js +0 -1
  144. package/lib/11.bri-components.min.js +0 -1
  145. package/lib/2.bri-components.min.js +0 -1
  146. package/lib/3.bri-components.min.js +0 -1
  147. package/lib/4.bri-components.min.js +0 -1
  148. package/lib/5.bri-components.min.js +0 -1
  149. package/lib/6.bri-components.min.js +0 -1
  150. package/lib/7.bri-components.min.js +0 -1
  151. package/lib/8.bri-components.min.js +0 -1
  152. package/lib/9.bri-components.min.js +0 -1
  153. package/lib/bri-components.min.js +0 -18
  154. package/src/utils/table.js +0 -175
@@ -1,377 +1,430 @@
1
- <template>
2
- <div class="BriUploadImage">
3
- <div
4
- class="BriUploadImage-set"
5
- ref="viewerImage"
6
- >
7
- <div
8
- v-if="value[propsObj._key] || propsObj._default || percent"
9
- :class="['BriUploadImage-set-img', isAvatar ? 'BriUploadImage-set-avatar' : '']"
10
- :style="{
11
- backgroundImage: `url(${$imageResize(value[propsObj._key] || propsObj._default, imageResizeConfig)})`,
12
- borderRadius: propsObj.radius ? '50%' : ''
13
- }"
14
- >
15
- <img
16
- :data-original="value[propsObj._key]"
17
- style="display:none"
18
- >
19
- <div
20
- v-if="value[propsObj._key] && propsObj._canAction"
21
- class="BriUploadImage-set-action"
22
- >
23
- <Icon
24
- class="BriUploadImage-set-img-action"
25
- type="ios-eye-outline"
26
- size="16"
27
- @click.native="handlePreview"
28
- ></Icon>
29
- <Icon
30
- class="BriUploadImage-set-img-action"
31
- type="ios-trash-outline"
32
- size="16"
33
- @click.native="handleRemove"
34
- ></Icon>
35
- </div>
36
- <!-- 上传进度 -->
37
- <div
38
- v-if="percent"
39
- class="BriUploadImage-set-img-circle"
40
- >
41
- <i-circle
42
- class="circle"
43
- :percent="percent"
44
- :stroke-color="percentColor"
45
- >
46
- <Icon
47
- v-if="percent == 100"
48
- type="ios-checkmark"
49
- ></Icon>
50
- <span v-else>{{ percent }}%</span>
51
- </i-circle>
52
- </div>
53
-
54
- </div>
55
- <div class="wrap">
56
- <Button type="default">点击上传</Button>
57
- <input
58
- id="fileupload"
59
- class="file"
60
- :accept="acceptType"
61
- :type="inputType"
62
- @change="setImage"
63
- />
64
- </div>
65
- </div>
66
-
67
- <!-- 修改头像模态框 -->
68
- <dsh-modal
69
- v-model="avatarModal"
70
- mode="custom"
71
- :propsObj="modalPropsObj"
72
- @on-visible-change="visibleChange"
73
- >
74
- <dsh-cropper
75
- class="BriUploadImage-cropper"
76
- ref="cropper"
77
- :src="imgSrc"
78
- alt="Source Image"
79
- :cropmove="cropImage"
80
- ></dsh-cropper>
81
-
82
- <dsh-buttons
83
- class="bri-modal-footer"
84
- :list="$getOperationList(['cancel', 'confirm'])"
85
- @click="$dispatchEvent($event)"
86
- ></dsh-buttons>
87
- </dsh-modal>
88
- </div>
89
- </template>
90
-
91
- <script>
92
- import uploadMixin from "./uploadMixin.js";
93
- import Viewer from "viewerjs";
94
-
95
- export default {
96
- name: "BriUploadImage",
97
- mixins: [
98
- uploadMixin
99
- ],
100
- components: {},
101
- props: {
102
- value: Object,
103
- propsObj: Object,
104
- // 上传的是阿里云还是本地
105
- requestOssType: {
106
- type: String,
107
- default: "default"
108
- },
109
- isAvatar: {
110
- type: Boolean,
111
- default: false
112
- },
113
- // 阿里云上传方式
114
- ossType: {
115
- type: String,
116
- default: "binaryMultipartUpload"
117
- }
118
- },
119
- data () {
120
- return {
121
- operationMap: {
122
- cancel: {
123
- name: "取消",
124
- type: "cancel",
125
- btnType: "cancel",
126
- event: "cancelAvatarModal"
127
- },
128
- confirm: {
129
- name: "确认",
130
- type: "confirm",
131
- btnType: "primary",
132
- event: "photoSubmit"
133
- }
134
- },
135
- // 头像
136
- avatarModal: false,
137
- inputType: "file",
138
- imgSrc: "",
139
- cropImg: ""
140
- };
141
- },
142
- computed: {
143
- modalPropsObj () {
144
- return {
145
- title: this.propsObj._name || "修改头像",
146
- class: "bri-modal",
147
- width: 450
148
- };
149
- },
150
- imageResizeConfig () {
151
- return this.propsObj._imageResizeConfig || {
152
- m: "fixed",
153
- w: 100,
154
- h: 100
155
- };
156
- },
157
- finalRequestOssType () {
158
- return this.propsObj._requestOssType || this.requestOssType || "default";
159
- },
160
- acceptType () {
161
- return this.propsObj._acceptType || "*";
162
- }
163
- },
164
- created () {
165
- },
166
- methods: {
167
- // 打开修改头像
168
- openAvatar () {
169
- this.avatarModal = true;
170
- },
171
- // 关闭修改头像
172
- cancelAvatarModal () {
173
- this.avatarModal = false;
174
- // this.inputType = "file";
175
- },
176
- // 头像模态框状态变化,关闭后改变input框类型,保证上传能够连续上传同一张图片
177
- visibleChange (bool) {
178
- if (!bool) {
179
- this.inputType = "file";
180
- }
181
- },
182
- setImage (e) {
183
- if (e.target.files.length != 0) {
184
- const file = e.target.files[0];
185
- if (!file.type.includes("image/")) {
186
- this.$Message.error("请选择一张图片");
187
- return;
188
- }
189
- if (typeof FileReader === "function") {
190
- const reader = new FileReader();
191
- if (this.propsObj._kind == "uploadImage" && !this.propsObj.cropper) {
192
- reader.onload = (event) => {
193
- let data = event.target.result;
194
- this.inputType = "text";
195
- if (this.finalRequestOssType === "local") {
196
- // base64转文件
197
- const imgFile = this.dataURLtoFile(data, "");
198
- this.handlePost(imgFile);
199
- } else {
200
- data = data.split(",")[1];
201
- let dataBuffer = Buffer.from(data, "base64");
202
- this.handlePost(dataBuffer);
203
- }
204
- };
205
- reader.readAsDataURL(file);
206
- } else {
207
- reader.onload = (event) => {
208
- this.imgSrc = event.target.result;
209
- // rebuild cropperjs with the updated source
210
- this.$refs.cropper.replace(event.target.result);
211
- this.inputType = "text";
212
- };
213
- reader.readAsDataURL(file);
214
- this.avatarModal = true;
215
- }
216
- } else {
217
- alert("Sorry, FileReader API not supported");
218
- }
219
- }
220
- },
221
- cropImage () {
222
- // get image data for post processing, e.g. upload or setting image src
223
- this.cropImg = this.$refs.cropper.getCroppedCanvas().toDataURL();
224
- },
225
- // 获取裁剪后的图片,转成file
226
- photoSubmit () {
227
- this.cropImg = this.$refs.cropper.getCroppedCanvas().toDataURL();
228
- if (this.finalRequestOssType === "local") {
229
- // base64转文件
230
- const imgFile = this.dataURLtoFile(this.cropImg, "");
231
- this.handlePost(imgFile);
232
- } else {
233
- let data = this.cropImg;
234
- data = data.split(",")[1];
235
-
236
- let dataBuffer = Buffer.from(data, "base64");
237
- this.handlePost(dataBuffer);
238
- }
239
-
240
- this.cancelAvatarModal();
241
- },
242
- // 将图片Base64 转成文件
243
- dataURLtoFile (dataurl, filename) {
244
- // 获取文件扩展名称
245
- let arr = dataurl.split(",");
246
- let mime = arr[0].match(/:(.*?);/)[1];
247
- let extension = mime.split("/")[1];
248
- let bstr = atob(arr[1]);
249
- let n = bstr.length;
250
- let u8arr = new Uint8Array(n);
251
- while (n--) {
252
- u8arr[n] = bstr.charCodeAt(n);
253
- }
254
- return new File([u8arr], `${filename}.${extension}`, {type: mime});
255
- },
256
- successCb (response, res) {
257
- this.value[this.propsObj._key] = res.data.downloadUrl;
258
- this.$emit("change", res);
259
- },
260
- handleError (err) {
261
- alert(err);
262
- },
263
- // 点击文件预览
264
- handlePreview (file) {
265
- let viewerImage = this.$refs.viewerImage;
266
- let viewer = new Viewer(viewerImage, {
267
- url: "data-original",
268
- hidden: function () {
269
- viewer.destroy();
270
- },
271
- loop: false,
272
- zIndex: 2147483647
273
- });
274
- viewer.show();
275
- },
276
- // 点击文件删除 - fileList服务器的数据列表
277
- handleRemove (file) {
278
- this.inputType = "file"; // 删除后可以重新上传
279
- this.value[this.propsObj._key] = "";
280
- this.change(this.value);
281
- },
282
- change (...params) {
283
- this.$emit("change", ...params);
284
- }
285
- }
286
- };
287
- </script>
288
-
289
- <style lang="less">
290
- .BriUploadImage {
291
- position: relative;
292
-
293
- &-set {
294
- width: 100%;
295
-
296
- &-img {
297
- width: 100px;
298
- height: 100px;
299
- float: left;
300
- background-repeat: no-repeat;
301
- background-position: center;
302
- background-size: contain;
303
- background-color: #fff;
304
- border: 1px solid @borderColor;
305
- border-radius: 0px;
306
- position: relative;
307
- overflow: hidden;
308
-
309
- &-action {
310
- color: @themeColor;
311
- cursor: pointer;
312
- }
313
-
314
- &-circle {
315
- position: absolute;
316
- top: 0px;
317
- bottom: 0px;
318
- left: 0px;
319
- right: 0px;
320
- background-color: #f4f5fa;
321
- display: flex;
322
- align-items: center;
323
- justify-content: center;
324
-
325
- .circle {
326
- width: 50px !important;
327
- height: 50px !important;
328
- }
329
-
330
- i {
331
- color: #5cb85c;
332
- font-size: 40px;
333
- }
334
- }
335
- }
336
-
337
- &-avatar {
338
- background-size: cover;
339
- }
340
-
341
- .wrap {
342
- width: 100px;
343
- height: 32px;
344
- position: relative;
345
- overflow: hidden;
346
- display: inline-block;
347
- line-height: 18px;
348
- text-align: center;
349
- vertical-align: middle;
350
- cursor: pointer;
351
-
352
- button {
353
- position: absolute;
354
- bottom: 0;
355
- left: 0;
356
- }
357
-
358
- .file {
359
- position: absolute;
360
- bottom: 0;
361
- left: 0;
362
- margin: 0;
363
- border: solid transparent;
364
- opacity: 0;
365
- filter: alpha(opacity=0);
366
- cursor: pointer;
367
- }
368
- }
369
- }
370
-
371
- &-cropper {
372
- width: 400px;
373
- height: 400px;
374
- margin: 0 auto;
375
- }
376
- }
377
- </style>
1
+ <template>
2
+ <div class="BriUploadImage">
3
+ <div
4
+ ref="viewerImage"
5
+ class="BriUploadImage-set"
6
+ >
7
+ <div
8
+ v-if="curVal || propsObj._default || percent"
9
+ :class="{
10
+ 'BriUploadImage-set-img': true,
11
+ 'BriUploadImage-set-avatar': isAvatar
12
+ }"
13
+ :style="{
14
+ backgroundImage: `url(${$imageResize(curVal || propsObj._default, imageResizeConfig)})`,
15
+ borderRadius: propsObj.radius ? '50%' : ''
16
+ }"
17
+ >
18
+ <img
19
+ :data-original="curVal"
20
+ style="display:none"
21
+ >
22
+ <div
23
+ v-if="curVal && canAction"
24
+ class="BriUploadImage-set-action"
25
+ >
26
+ <Icon
27
+ class="BriUploadImage-set-img-action"
28
+ type="ios-eye-outline"
29
+ size="16"
30
+ @click.native="handlePreview"
31
+ ></Icon>
32
+ <Icon
33
+ class="BriUploadImage-set-img-action"
34
+ type="ios-trash-outline"
35
+ size="16"
36
+ @click.native="handleRemove"
37
+ ></Icon>
38
+ </div>
39
+
40
+ <!-- 上传进度 -->
41
+ <div
42
+ v-if="percent"
43
+ class="BriUploadImage-set-img-circle"
44
+ >
45
+ <i-circle
46
+ class="circle"
47
+ :percent="percent"
48
+ :stroke-color="percentColor"
49
+ >
50
+ <Icon
51
+ v-if="percent == 100"
52
+ type="ios-checkmark"
53
+ ></Icon>
54
+ <span v-else>{{ percent }}%</span>
55
+ </i-circle>
56
+ </div>
57
+ </div>
58
+
59
+ <div class="wrap">
60
+ <Button type="default">点击上传</Button>
61
+ <input
62
+ id="fileupload"
63
+ class="file"
64
+ :accept="acceptType"
65
+ :type="inputType"
66
+ @change="setImage"
67
+ />
68
+ </div>
69
+ </div>
70
+
71
+ <!-- 修改头像模态框 -->
72
+ <dsh-modal
73
+ v-model="avatarModal"
74
+ mode="custom"
75
+ :propsObj="modalPropsObj"
76
+ @on-visible-change="visibleChange"
77
+ >
78
+ <dsh-cropper
79
+ ref="cropper"
80
+ class="BriUploadImage-cropper"
81
+ :src="imgSrc"
82
+ alt="Source Image"
83
+ :cropmove="cropImage"
84
+ ></dsh-cropper>
85
+
86
+ <dsh-buttons
87
+ class="bri-modal-footer"
88
+ :list="$getOperationList(['cancel', 'confirm'])"
89
+ @click="$dispatchEvent($event)"
90
+ ></dsh-buttons>
91
+ </dsh-modal>
92
+ </div>
93
+ </template>
94
+
95
+ <script>
96
+ import uploadMixin from "./uploadMixin.js";
97
+ import Viewer from "viewerjs";
98
+
99
+ export default {
100
+ name: "BriUploadImage",
101
+ mixins: [
102
+ uploadMixin
103
+ ],
104
+ components: {},
105
+ props: {
106
+ value: {
107
+ type: Object,
108
+ default () {
109
+ return {};
110
+ }
111
+ },
112
+ propsObj: {
113
+ type: Object,
114
+ default () {
115
+ return {};
116
+ }
117
+ },
118
+
119
+ isAvatar: {
120
+ type: Boolean,
121
+ default: false
122
+ },
123
+ // 上传的是阿里云还是本地
124
+ requestOssType: {
125
+ type: String,
126
+ default: "default",
127
+ validator (val) {
128
+ // "default"代表阿里云
129
+ return ["default", "local"].includes(val);
130
+ }
131
+ },
132
+ // 阿里云上传方式
133
+ ossType: {
134
+ type: String,
135
+ default: "binaryMultipartUpload"
136
+ }
137
+ },
138
+ data () {
139
+ return {
140
+ inputType: "file",
141
+
142
+ // 头像
143
+ avatarModal: false,
144
+ imgSrc: "",
145
+ cropImg: "",
146
+
147
+ operationMap: {
148
+ cancel: {
149
+ name: "取消",
150
+ type: "cancel",
151
+ btnType: "cancel",
152
+ event: "closeAvatarModal"
153
+ },
154
+ confirm: {
155
+ name: "确认",
156
+ type: "confirm",
157
+ btnType: "primary",
158
+ event: "submitCropImage"
159
+ }
160
+ }
161
+ };
162
+ },
163
+ computed: {
164
+ selfPropsObj () {
165
+ return {
166
+ ...this.propsObj
167
+ };
168
+ },
169
+ controlKey () {
170
+ return this.selfPropsObj._key;
171
+ },
172
+ controlName () {
173
+ return this.selfPropsObj._name;
174
+ },
175
+ // 使用操作图标
176
+ canAction () {
177
+ return this.selfPropsObj._canAction;
178
+ },
179
+ imageResizeConfig () {
180
+ return this.selfPropsObj._imageResizeConfig || {
181
+ m: "fixed",
182
+ w: 100,
183
+ h: 100
184
+ };
185
+ },
186
+ finalRequestOssType () {
187
+ return this.selfPropsObj._requestOssType || this.requestOssType;
188
+ },
189
+ acceptType () {
190
+ return this.selfPropsObj._acceptType || "*";
191
+ },
192
+
193
+ modalPropsObj () {
194
+ return {
195
+ title: this.controlName || "修改头像",
196
+ class: "bri-modal",
197
+ width: 450
198
+ };
199
+ },
200
+
201
+ curVal: {
202
+ get () {
203
+ return this.value[this.controlKey];
204
+ },
205
+ set (val) {
206
+ this.value[this.controlKey] = val;
207
+ }
208
+ }
209
+ },
210
+ created () {},
211
+ methods: {
212
+ setImage (e) {
213
+ if (e.target.files.length) {
214
+ const file = e.target.files[0];
215
+ if (!file.type.includes("image/")) {
216
+ this.$Message.error("请选择一张图片");
217
+ }
218
+ else if (typeof FileReader !== "function") {
219
+ this.$Message.error("Sorry, FileReader API not supported");
220
+ }
221
+ else {
222
+ const reader = new FileReader();
223
+ if (this.propsObj._kind === "uploadImage" && !this.propsObj.cropper) {
224
+ reader.onload = (event) => {
225
+ this.inputType = "text";
226
+ this.dealPostImage(event.target.result); // event.target.result是base64格式
227
+ };
228
+ reader.readAsDataURL(file);
229
+ }
230
+ // 使用裁剪
231
+ else {
232
+ reader.onload = (event) => {
233
+ this.inputType = "text";
234
+ this.imgSrc = event.target.result;
235
+ this.$refs.cropper.replace(event.target.result); // event.target.result是base64格式
236
+ };
237
+ reader.readAsDataURL(file);
238
+
239
+ this.openAvatarModal();
240
+ }
241
+ }
242
+ }
243
+ },
244
+ // 提交裁剪后的图片
245
+ submitCropImage () {
246
+ this.cropImage();
247
+ this.dealPostImage(this.cropImg);
248
+
249
+ this.closeAvatarModal();
250
+ },
251
+
252
+ // 获取裁剪的图片
253
+ cropImage () {
254
+ // get image data for post processing, e.g. upload or setting image src
255
+ this.cropImg = this.$refs.cropper.getCroppedCanvas().toDataURL(); // base64格式
256
+ },
257
+ // 处理图片的提交
258
+ dealPostImage (data) {
259
+ // local好像是minio在用
260
+ if (this.finalRequestOssType === "local") {
261
+ // base64转文件
262
+ // {
263
+ // lastModified: 1752065308269
264
+ // name: ".png"
265
+ // size: 528557
266
+ // type: "image/png"
267
+ // webkitRelativePath: ""
268
+ // }
269
+ const imgFile = this.dataURLtoFile(data, "");
270
+ this.handlePost(imgFile);
271
+ // console.dir(imgFile); // object类型
272
+ } else {
273
+ const dataBuffer = Buffer.from(data.split(",")[1], "base64");
274
+ this.handlePost(dataBuffer);
275
+ // console.dir(dataBuffer); // object类型
276
+ }
277
+ },
278
+ // 将图片Base64 转成文件
279
+ dataURLtoFile (dataurl, filename) {
280
+ // 获取文件扩展名称
281
+ let arr = dataurl.split(",");
282
+ let mime = arr[0].match(/:(.*?);/)[1];
283
+ let extension = mime.split("/")[1];
284
+ let bstr = atob(arr[1]);
285
+ let n = bstr.length;
286
+ let u8arr = new Uint8Array(n);
287
+ while (n--) {
288
+ u8arr[n] = bstr.charCodeAt(n);
289
+ }
290
+ return new File([u8arr], `${filename}.${extension}`, { type: mime });
291
+ },
292
+
293
+ successCb (response, res) {
294
+ this.curVal = res.data.downloadUrl;
295
+ this.$emit("change", res);
296
+ },
297
+ handleError (err) {
298
+ alert(err);
299
+ },
300
+
301
+ // 点击文件预览
302
+ handlePreview (file) {
303
+ let viewerImage = this.$refs.viewerImage;
304
+ let viewer = new Viewer(viewerImage, {
305
+ url: "data-original",
306
+ hidden: function () {
307
+ viewer.destroy();
308
+ },
309
+ loop: false,
310
+ zIndex: 2147483647
311
+ });
312
+ viewer.show();
313
+ },
314
+ // 点击文件删除 - fileList服务器的数据列表
315
+ handleRemove (file) {
316
+ this.inputType = "file"; // 删除后可以重新上传
317
+ this.curVal = "";
318
+ this.change(this.value);
319
+ },
320
+ change (...params) {
321
+ this.$emit("change", ...params);
322
+ },
323
+
324
+ // 打开修改头像
325
+ openAvatarModal () {
326
+ this.avatarModal = true;
327
+ },
328
+ // 关闭修改头像
329
+ closeAvatarModal () {
330
+ this.avatarModal = false;
331
+ },
332
+ // 头像模态框状态变化,关闭后改变input框类型,保证上传能够连续上传同一张图片
333
+ visibleChange (bool) {
334
+ if (!bool) {
335
+ this.inputType = "file";
336
+ }
337
+ }
338
+ }
339
+ };
340
+ </script>
341
+
342
+ <style lang="less">
343
+ .BriUploadImage {
344
+ position: relative;
345
+
346
+ &-set {
347
+ width: 100%;
348
+
349
+ &-img {
350
+ width: 100px;
351
+ height: 100px;
352
+ float: left;
353
+ background-repeat: no-repeat;
354
+ background-position: center;
355
+ background-size: contain;
356
+ background-color: #fff;
357
+ border: 1px solid @borderColor;
358
+ border-radius: 0px;
359
+ position: relative;
360
+ overflow: hidden;
361
+
362
+ &-action {
363
+ color: @themeColor;
364
+ cursor: pointer;
365
+ }
366
+
367
+ &-circle {
368
+ position: absolute;
369
+ top: 0px;
370
+ bottom: 0px;
371
+ left: 0px;
372
+ right: 0px;
373
+ background-color: #f4f5fa;
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+
378
+ .circle {
379
+ width: 50px !important;
380
+ height: 50px !important;
381
+ }
382
+
383
+ i {
384
+ color: #5cb85c;
385
+ font-size: 40px;
386
+ }
387
+ }
388
+ }
389
+
390
+ &-avatar {
391
+ background-size: cover;
392
+ }
393
+
394
+ .wrap {
395
+ width: 100px;
396
+ height: 32px;
397
+ position: relative;
398
+ overflow: hidden;
399
+ display: inline-block;
400
+ line-height: 18px;
401
+ text-align: center;
402
+ vertical-align: middle;
403
+ cursor: pointer;
404
+
405
+ button {
406
+ position: absolute;
407
+ bottom: 0;
408
+ left: 0;
409
+ }
410
+
411
+ .file {
412
+ position: absolute;
413
+ bottom: 0;
414
+ left: 0;
415
+ margin: 0;
416
+ border: solid transparent;
417
+ opacity: 0;
418
+ filter: alpha(opacity=0);
419
+ cursor: pointer;
420
+ }
421
+ }
422
+ }
423
+
424
+ &-cropper {
425
+ width: 400px;
426
+ height: 400px;
427
+ margin: 0 auto;
428
+ }
429
+ }
430
+ </style>