sasp-admin 0.2.57

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 (141) hide show
  1. package/index.js +227 -0
  2. package/package.json +19 -0
  3. package/router.js +83 -0
  4. package/src/assets/font/iconfont.css +1346 -0
  5. package/src/assets/font/iconfont.eot +0 -0
  6. package/src/assets/font/iconfont.js +1 -0
  7. package/src/assets/font/iconfont.svg +827 -0
  8. package/src/assets/font/iconfont.ttf +0 -0
  9. package/src/assets/font/iconfont.woff +0 -0
  10. package/src/assets/images/loading-bar.gif +0 -0
  11. package/src/assets/js/adminInstall.js +36 -0
  12. package/src/assets/js/api/apiAdmin.js +613 -0
  13. package/src/assets/js/global/dataGlobal.js +260 -0
  14. package/src/assets/js/global/logGlobal.js +22 -0
  15. package/src/assets/js/global/paramGlobal.js +67 -0
  16. package/src/assets/js/global/resGlobal.js +91 -0
  17. package/src/assets/js/global/userGlobal.js +283 -0
  18. package/src/components/complexViewRendering.vue +601 -0
  19. package/src/components/ifmLink.vue +71 -0
  20. package/src/components/public/data/plDataCascader.vue +85 -0
  21. package/src/components/public/data/plDataRadio.vue +73 -0
  22. package/src/components/public/data/plDataRadioGroup.vue +70 -0
  23. package/src/components/public/data/plDataSelect.vue +856 -0
  24. package/src/components/public/data/plDatePicker.vue +159 -0
  25. package/src/components/public/org/bg.png +0 -0
  26. package/src/components/public/org/sysOrgPosUserSelect.vue +1237 -0
  27. package/src/components/public/org/sysOrgPosUserSelectDark.vue +1402 -0
  28. package/src/components/public/org/sysOrgPosUserSelectNew.vue +1527 -0
  29. package/src/components/public/upload/images/compress.png +0 -0
  30. package/src/components/public/upload/images/emipty.png +0 -0
  31. package/src/components/public/upload/images/excel.png +0 -0
  32. package/src/components/public/upload/images/file.png +0 -0
  33. package/src/components/public/upload/images/pdf.png +0 -0
  34. package/src/components/public/upload/images/powerpoint.png +0 -0
  35. package/src/components/public/upload/images/project.png +0 -0
  36. package/src/components/public/upload/images/sound.png +0 -0
  37. package/src/components/public/upload/images/txt.png +0 -0
  38. package/src/components/public/upload/images/video.png +0 -0
  39. package/src/components/public/upload/images/visio.png +0 -0
  40. package/src/components/public/upload/images/word.png +0 -0
  41. package/src/components/public/upload/plImage.vue +287 -0
  42. package/src/components/public/upload/plImgUpload.vue +137 -0
  43. package/src/components/public/upload/plUpload.vue +1124 -0
  44. package/src/components/public/upload/uploadImg.js +8 -0
  45. package/src/main.js +0 -0
  46. package/src/views/VueMenuView.vue +143 -0
  47. package/src/views/cloudMenuView.vue +125 -0
  48. package/src/views/complex/config/complex.vue +501 -0
  49. package/src/views/complex/config/complexSetting.vue +1250 -0
  50. package/src/views/complex/rendering/complexShow.vue +16 -0
  51. package/src/views/data/dataManage.vue +560 -0
  52. package/src/views/data/sysData.vue +292 -0
  53. package/src/views/event/eventManager/vueEventDiy.vue +1184 -0
  54. package/src/views/event/eventManager/vueEventMain.vue +108 -0
  55. package/src/views/event/eventManager/vueEventSys.vue +296 -0
  56. package/src/views/event/js/apiEvent.js +22 -0
  57. package/src/views/fileLog/fileDownloadLog.vue +437 -0
  58. package/src/views/initData/initData.vue +4316 -0
  59. package/src/views/log/dblog/logdbDevelop.vue +306 -0
  60. package/src/views/log/dblog/logdbEnt.vue +331 -0
  61. package/src/views/log/dblog/logdbGov.vue +395 -0
  62. package/src/views/log/error/logError.vue +553 -0
  63. package/src/views/log/loginlog/logManageDevOrSup.vue +357 -0
  64. package/src/views/log/loginlog/logManageEnt.vue +343 -0
  65. package/src/views/log/loginlog/logManageGov.vue +328 -0
  66. package/src/views/log/sms/logSms.vue +308 -0
  67. package/src/views/menu/component/menuManageComponent.vue +2402 -0
  68. package/src/views/menu/component/menuModule.vue +449 -0
  69. package/src/views/menu/menuLocal.vue +223 -0
  70. package/src/views/menu/menuManage.vue +1135 -0
  71. package/src/views/menu/tenantMenuManage.vue +1132 -0
  72. package/src/views/menuRouter/cview/cviewShow.vue +18 -0
  73. package/src/views/menuRouter/cviewMenuRouter.vue +183 -0
  74. package/src/views/menuRouter/menuView.vue +132 -0
  75. package/src/views/menuRouter/urlMenuRouter.vue +160 -0
  76. package/src/views/org/entOrgTree.vue +1050 -0
  77. package/src/views/org/ownerMenu/ownerMenuTree.vue +269 -0
  78. package/src/views/org/safeValidate/safeValidate.vue +469 -0
  79. package/src/views/org/sysEntOrgUserDetail.vue +3390 -0
  80. package/src/views/org/sysOrgDimension.vue +832 -0
  81. package/src/views/org/sysOrgPosUserDetail.vue +1648 -0
  82. package/src/views/org/sysOrgPosUserTree.vue +1101 -0
  83. package/src/views/org/sysOrgTree.vue +864 -0
  84. package/src/views/param/sysParam.vue +987 -0
  85. package/src/views/preview/pdfViewer.vue +82 -0
  86. package/src/views/resources/js/resourcesCommon.js +137 -0
  87. package/src/views/resources/resRouter/resView.vue +161 -0
  88. package/src/views/resources/resourcesTabs.vue +82 -0
  89. package/src/views/resources/tabs/comp/pageResPreview.vue +309 -0
  90. package/src/views/resources/tabs/comp/pageResRegister.vue +1120 -0
  91. package/src/views/resources/tabs/dataResources.vue +843 -0
  92. package/src/views/resources/tabs/pageResources.vue +970 -0
  93. package/src/views/role/allowMenu.vue +148 -0
  94. package/src/views/role/authRole/authRole.vue +427 -0
  95. package/src/views/role/authRole/component/allocateSetting.vue +1056 -0
  96. package/src/views/role/authRole/component/authSetting.vue +1196 -0
  97. package/src/views/role/commonRole/commonRole.vue +677 -0
  98. package/src/views/role/commonRole/compoment/allocateRoleMenuSetting.vue +335 -0
  99. package/src/views/role/commonRole/compoment/authLinkMenuTree.vue +55 -0
  100. package/src/views/role/commonRole/compoment/authSettingNew.vue +190 -0
  101. package/src/views/role/commonRole/compoment/commonSetting.vue +1576 -0
  102. package/src/views/role/commonRole/compoment/commonSettingAdjust.vue +584 -0
  103. package/src/views/role/commonRole/compoment/commonSettingNew.vue +572 -0
  104. package/src/views/role/commonRole/compoment/roleMenuPower.vue +226 -0
  105. package/src/views/role/commonRole/compoment/roleMenuPowerSetting.vue +69 -0
  106. package/src/views/role/commonRole/compoment/roleMenuSetting.vue +365 -0
  107. package/src/views/role/commonRole/compoment/roleSourceSetting.vue +229 -0
  108. package/src/views/role/commonRole/tenantCommonRole.vue +768 -0
  109. package/src/views/role/role.vue +135 -0
  110. package/src/views/role/roleMenuOption.vue +898 -0
  111. package/src/views/role/roleSynchroRemind.vue +399 -0
  112. package/src/views/role/sysRole.vue +1525 -0
  113. package/src/views/role/viewMenuOptDetail.vue +182 -0
  114. package/src/views/sms/sendSms.vue +164 -0
  115. package/src/views/station/orgStation.vue +561 -0
  116. package/src/views/tenant/appContentManager.vue +938 -0
  117. package/src/views/tenant/appManager.vue +642 -0
  118. package/src/views/tenant/tenantRoleManager.vue +670 -0
  119. package/src/views/tenant/tenantUserManager.vue +615 -0
  120. package/src/views/threeinone/compoment/safeCascadeSelect.vue +327 -0
  121. package/src/views/threeinone/init/safeInitRegion.vue +203 -0
  122. package/src/views/threeinone/safeManager.vue +927 -0
  123. package/src/views/threeinone/safeMenuManage.vue +565 -0
  124. package/src/views/threeinone/safeOrgSpv.vue +364 -0
  125. package/src/views/threeinone/safeSpv/safeSpvLeftTree.vue +109 -0
  126. package/src/views/threeinone/safeSpv/safeSpvMain.vue +335 -0
  127. package/src/views/threeinone/safeSpvEconView.vue +569 -0
  128. package/src/views/threeinone/safeValidateRegion.vue +328 -0
  129. package/src/views/urlResource/urlResource.vue +856 -0
  130. package/src/views/user/empowerUser/empowerEntUserManage.vue +415 -0
  131. package/src/views/user/empowerUser/empowerOrgTree.vue +167 -0
  132. package/src/views/user/empowerUser/empowerUserList.vue +633 -0
  133. package/src/views/user/empowerUser/empowerUserListMenuDeatil.vue +656 -0
  134. package/src/views/user/empowerUser/empowerUserListViewMenuTree.vue +257 -0
  135. package/src/views/user/empowerUser/empowerUserManage.vue +99 -0
  136. package/src/views/user/stationUserManage.vue +934 -0
  137. package/src/views/user/userManage.vue +737 -0
  138. package/src/views/user/userMangement.vue +938 -0
  139. package/src/views/user/viewMenu/viewMenu.vue +113 -0
  140. package/src/views/versionupdatetool/versionUpdateTool.vue +225 -0
  141. package/src/views/versionupdatetool/versioninfomation/verisonInfomationManagement.vue +68 -0
@@ -0,0 +1,1124 @@
1
+ <template>
2
+ <div class="pl-upload-container" :id="divId">
3
+ <el-upload drag v-loading="loading" :element-loading-text="uploadLoadingText"
4
+ :file-list="fileList"
5
+ :show-file-list="false"
6
+ :action="uploadUrl"
7
+ :on-success="onSuccess"
8
+ :on-exceed="onExceed"
9
+ :http-request="uploadFileMethod"
10
+ :accept="acceptFileType"
11
+ :limit="limit"
12
+ multiple
13
+ style="width:100%;white-space: pre-wrap;"
14
+ v-if="!isDisabled && !isView">
15
+ <div v-if="!isView">
16
+ <i class="el-icon-upload"></i>
17
+ <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
18
+ </div>
19
+ </el-upload>
20
+ <div v-for="item in stretchNum" style="height: 50px"></div>
21
+ <div v-if="isView && fileList.length == 0" class="el-upload__text">
22
+ <el-tag type="info">未上传附件</el-tag>
23
+ </div>
24
+
25
+ <div class="pl-flie-list" id="viewer-selection" v-viewer>
26
+ <div class="pl-file-list-item" v-for="file in fileList" :title="file.name">
27
+ <div class="pl-file-list-item-img">
28
+ <img :src="file.url" :id="file.id" :onerror="defaultImg"/>
29
+ </div>
30
+ <div class="pl-file-list-item-text">
31
+ {{ file.name }}
32
+ </div>
33
+ <div class="pl-file-list-item-btn pos-abs-full">
34
+ <div class="top-btn" @click.stop="tempRemove(file)" v-if="!isDisabled && !isView">
35
+ <i class="el-icon-close btn-close" title="删除"></i>
36
+ </div>
37
+ <div class="center-btn">
38
+ <span v-if="file.isPreview">
39
+ <el-button :type="type" round v-if="file.isPlay" size="small"
40
+ :icon="icon"
41
+ :title="`点击播放 ${file.name}`"
42
+ @click="previewFile(file, file.imgIndex)">{{ clickText }}</el-button>
43
+ <el-button type="primary" round v-else size="small"
44
+ icon="el-icon-view"
45
+ :title="`点击预览 ${file.name}`"
46
+ @click="previewFile(file, file.imgIndex)">预览</el-button>
47
+ </span>
48
+ <el-button type="info" size="small" v-if="candownload" round icon="el-icon-download"
49
+ :title="`点击下载 ${file.name}`"
50
+ @click="downloadFile(file.downloadUrl,file)">下载
51
+ </el-button>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <el-dialog class="pl-upload-temp-dialog" :visible.sync="tempDialogVisible"
58
+ append-to-body :close-on-press-escape="false"
59
+ :close-on-click-modal="false" v-if="tempDialogVisible"></el-dialog>
60
+
61
+ <!-- 音频视频预览 -->
62
+ <el-dialog custom-class="pl-audiovisual-dialog"
63
+ top="10vh"
64
+ :visible.sync="preview.audiovisualDialogVisible"
65
+ append-to-body
66
+ :before-close="audiovisualBeforeClose">
67
+ <d-player :options="{video: {url: preview.audiovisualSrc}, autoplay: false}"
68
+ style="width: 1000px; height: 800px;"
69
+ ref="videoRef"/>
70
+ </el-dialog>
71
+ <!-- 音频播放 -->
72
+ <div ref="aplayer" style="display: none"></div>
73
+ <el-dialog
74
+ title="水印选择" append-to-body
75
+ :visible.sync="waterdialogVisible"
76
+ width="300px">
77
+ <el-select v-model="checkWaterMarkText" placeholder="请选择" >
78
+ <el-option
79
+ v-for="item in (waterMakeConfig.waterArr||[])"
80
+ :key="item"
81
+ :label="item"
82
+ :value="item">
83
+ </el-option>
84
+ </el-select>
85
+ <span slot="footer" class="dialog-footer">
86
+ <el-button @click="waterdialogVisible = false">取 消</el-button>
87
+ <el-button type="primary" @click="downLoadWaterMarkFile">确 定</el-button>
88
+ </span>
89
+ </el-dialog>
90
+ </div>
91
+ </template>
92
+
93
+ <script>
94
+ import Vue from 'vue';
95
+ import Viewer from 'v-viewer';
96
+ import 'viewerjs/dist/viewer.css';
97
+ import VueDPlayer from 'vue-dplayer';
98
+ import 'vue-dplayer/dist/vue-dplayer.css';
99
+ import APlayer from 'aplayer';
100
+ import 'aplayer/dist/APlayer.min.css';
101
+ import uploadImg from "./uploadImg";
102
+ import html2canvas from 'html2canvas'
103
+
104
+ Vue.use(Viewer, {
105
+ defaultOptions: {
106
+ zIndex: 9999
107
+ }
108
+ });
109
+
110
+ export default {
111
+ name: "pl-upload",
112
+ components: {
113
+ 'd-player': VueDPlayer,
114
+ },
115
+ props: {
116
+ fkId: {
117
+ type: String,
118
+ required: true
119
+ },
120
+ fkType: String,
121
+ isDisabled: {
122
+ type: Boolean,
123
+ default: false
124
+ },
125
+ candownload: {
126
+ type: Boolean,
127
+ default: true
128
+ },
129
+ plFileType: {// 逗号分隔的文件类型,.doc,.jpg。。
130
+ type: String,
131
+ default: ""
132
+ },
133
+ disableFileType: {// 禁止使用的文件类型,逗号分隔的文件类型,.doc,.jpg。。
134
+ type: String,
135
+ default: ""
136
+ },
137
+ isView: {//是否只可查看
138
+ type: Boolean,
139
+ default: false
140
+ },
141
+ limit: {
142
+ type: Number,
143
+ default: 0
144
+ },
145
+ extraPath: {
146
+ type: String,
147
+ default: ""
148
+ },
149
+ ifTempRemove: {
150
+ type: Boolean,
151
+ default: false
152
+ },
153
+ tempRemoveFile: {
154
+ type: Array,
155
+ default: () => {
156
+ return [];
157
+ }
158
+ },//临时删除的附件
159
+ field: {
160
+ type: String,
161
+ }, // 附件变更时的记录字段
162
+ uploadFileRecord: {
163
+ type: Function
164
+ }, // 附件的变更记录方法
165
+ downInstructions: { //是否需要下载日志
166
+ type: Boolean,
167
+ default: false
168
+ },
169
+ waterMakeConfig: {//水印
170
+ type: Object,
171
+ default: function () {
172
+ return {}
173
+ }
174
+ }
175
+ },
176
+ data() {
177
+ return {
178
+ fileFkId: "",
179
+ uploadUrl: "",
180
+ uploadLoadingText:"正在上传,请稍等...",
181
+ stretchNum:0,
182
+ fileList: [],
183
+ divId: "divId_" + this.COMMON_FUNC.getUUID(),
184
+ defaultImg: 'this.src="' + require('./images/emipty.png') + '"',
185
+ acceptFileType: "", // 允许上传的文件类型
186
+ fileTypeValid: true, // 文件类型验证结果,当前element上传前验证失败触发了删除方法,但是我们不需要
187
+ tempDialogVisible: false, //是否显示虚拟dialog
188
+ // key即为文件类型又为图片名称
189
+ objFileTypeImgs: {
190
+ word: ["docx", "doc"],
191
+ excel: ["xlsx", "xls"],
192
+ powerpoint: ["ppt", "pptx"],
193
+ compress: ["rar", "zip", "gz", "jar", "arj", "z"],
194
+ video: ["mp4", "avi", "flv", "rmvb", "3gp", "mov", "m4v", "wmv", "asf", "asx", "rm", "dat", "mkv", "vob"],
195
+ sound: ["mp3", "wma", "wav", "midi", "ape", "flac"],
196
+ pdf: ["pdf"],
197
+ txt: ["txt"],
198
+ project: ["mpp"],
199
+ visio: ["vsdx", "vsd"]
200
+ },
201
+ loading: false,
202
+ objExtensionToImgType: {},
203
+ //预览
204
+ preview: {
205
+ //显示音/视频预览
206
+ audiovisualDialogVisible: false,
207
+ audiovisualSrc: '',
208
+ audiovisualType: '',
209
+ audiovisualId: ''
210
+ },
211
+ ap: {
212
+ container: '',
213
+ audio: {
214
+ url: '',
215
+ }
216
+ },
217
+ clickText: '播放',
218
+ icon: "el-icon-video-play",
219
+ type: "success",
220
+ disableFileArr: [], // 不可以上传的文件类型
221
+ hasWater: false,
222
+ waterdialogVisible:false,
223
+ checkWaterMarkText:"",
224
+ downloadWaterMake:{
225
+ waterMakeText: "我是水印",
226
+ fileName:"水印下载",
227
+ fileType:"png",
228
+ fileUrl:""
229
+ }
230
+ }
231
+ },
232
+
233
+ watch: {
234
+ fkId() {
235
+ this.initUpload();
236
+ },
237
+ fkType() {
238
+ this.initUpload();
239
+ },
240
+ fileList() {
241
+ // 将调用此组件的v-model值设置为文件长度以设置必填(若有回调,在下一行增加回调方法)
242
+ this.$emit('input', this.fileList.length == 0 ? "" : "" + this.fileList.length);
243
+ }
244
+ },
245
+
246
+ created() {
247
+ this.initSetting();
248
+ this.initUpload();
249
+ },
250
+
251
+ methods: {
252
+ /*
253
+ ** 初始化配置
254
+ */
255
+ initSetting() {
256
+ // 初始化文件上传类型
257
+ this.hasWater = this.waterMakeConfig.hasWater;
258
+ let uploadFileType = this.plFileType || ""; // 允许上传的附件类型
259
+ if (uploadFileType) {
260
+ // 转换为字符串,文件类型加上.,原项目无.
261
+ let arr = uploadFileType.split(",");
262
+ let typeArr = [];
263
+ arr.forEach(type => {
264
+ if (type == "all") { // 原项目all是所有,所有在组件中就是""
265
+ typeArr.push("");
266
+ } else if ((type || "").indexOf(".") == -1) {
267
+ typeArr.push("." + type);
268
+ } else {
269
+ typeArr.push(type);
270
+ }
271
+ });
272
+ uploadFileType = typeArr.join(",");
273
+ }
274
+ this.acceptFileType = uploadFileType;
275
+
276
+ this.objExtensionToImgType = {};
277
+ for (let [img, exts] of Object.entries(this.objFileTypeImgs)) {
278
+ exts.forEach(ext => {
279
+ this.objExtensionToImgType[ext] = img;
280
+ });
281
+ }
282
+
283
+ if (this.disableFileType) {
284
+ this.disableFileArr = this.disableFileType.split(",");
285
+ }
286
+ },
287
+ /*
288
+ ** 初始化上传组件
289
+ */
290
+ initUpload() {
291
+ let vm = this;
292
+ vm.fileFkId = (vm.fkId || "");
293
+ if (vm.fkType) {
294
+ vm.fileFkId += "_" + (vm.fkType || "");
295
+ }
296
+ if (!vm.fkId) {
297
+ vm.fileList = [];
298
+ return;
299
+ }
300
+ vm.uploadUrl = vm.api.baseUploadUrl + "upload";
301
+ vm.initFiles();
302
+ },
303
+ /*
304
+ ** 初始化上传文件信息列表
305
+ */
306
+ initFiles() {
307
+ let vm = this;
308
+ let fileListDom = window.document.querySelector("#" + this.divId + ".el-upload-list");
309
+ if (fileListDom) {
310
+ fileListDom.innerHTML = "";
311
+ }
312
+ vm.axios.post(vm.api.baseUploadUrl + "viewFile", {"fkId": vm.fileFkId}).then(function (response) {
313
+ let resultFile = [];
314
+ let arrFile = response.data;
315
+ let imgIndex = 0;
316
+ arrFile.forEach(function (file) {
317
+ if (vm.tempRemoveFile.indexOf(file.id) > -1) {
318
+ return;
319
+ }
320
+ file.downloadUrl = vm.api.baseUploadUrl + "downloadFile?id=" + file.id;
321
+ // file.downloadUrl = file.downloadUrl.replace("uploadController/downloadFile?id", "wepUploadAction!downloadFile?fjid");
322
+ // 获取小写文件扩展名
323
+ let extension = (file.extension || "").toLowerCase();
324
+ if (extension === "jpg" || extension === "jpeg" || extension === "png") {
325
+ file.url = file.downloadUrl;
326
+ file.isPreview = true;
327
+ } else if (vm.objExtensionToImgType[extension]) {
328
+ file.url = uploadImg[vm.objExtensionToImgType[extension] + ".png"];
329
+ const dtype = vm.objExtensionToImgType[extension].toLowerCase();
330
+ if (dtype === 'word' || dtype === 'excel' ||
331
+ dtype === 'powerpoint' || dtype === 'pdf' ||
332
+ dtype === 'video'
333
+ ) {
334
+ file.isPreview = true;
335
+ } else if (dtype === 'sound') {
336
+ file.isPreview = true;
337
+ file.isPlay = true;
338
+ }
339
+ } else {
340
+ file.url = uploadImg["file.png"];
341
+ }
342
+ file.imgIndex = imgIndex++;
343
+ resultFile.push(file);
344
+ });
345
+ vm.fileList = resultFile;
346
+ vm.fileList.forEach(file => {
347
+ let extension = (file.extension || "").toLowerCase();
348
+ if (vm.hasWater && (extension === "jpg" || extension === "jpeg" || extension === "png")) {
349
+ vm.getImageFileFromUrl(file.downloadUrl, file.name)
350
+ .then((response) => {
351
+ // 返回的是文件对象,使用变量接收即可
352
+ try {
353
+ vm.getBase64(response).then((imgResult) => {
354
+ let waterMake = {
355
+ waterMakeText: vm.waterMakeConfig.defaultWaterMake,
356
+ fileName:file.name,
357
+ fileType:extension
358
+ }
359
+ vm.base64AddWaterMaker(imgResult, waterMake,"view").then((res) => {
360
+ // 这里可以把添加水印后的文件传给后端,我这里只是举例并没有做
361
+ // console.log("res", imgResult);
362
+ file.url = res;
363
+ });
364
+ })
365
+ } catch (error) {
366
+ console.log('error:', error);
367
+ }
368
+ })
369
+ .catch((e) => {
370
+ console.error(e);
371
+ })
372
+ }
373
+ })
374
+ });
375
+ },
376
+ /**
377
+ * 根据图片url转为png文件对象
378
+ * @param url
379
+ * @param imageName
380
+ * @returns {Promise<unknown>}
381
+ */
382
+ getImageFileFromUrl(url, imageName) {
383
+ return new Promise((resolve, reject) => {
384
+ var blob = null;
385
+ var xhr = new XMLHttpRequest();
386
+ xhr.open("GET", url);
387
+ xhr.setRequestHeader('Accept', 'image/png');
388
+ xhr.responseType = "blob";
389
+ // 加载时处理
390
+ xhr.onload = () => {
391
+ // 获取返回结果
392
+ blob = xhr.response;
393
+ let imgFile = new File([blob], imageName, {type: 'image/png'});
394
+ // 返回结果
395
+ resolve(imgFile);
396
+ };
397
+ xhr.onerror = (e) => {
398
+ reject(e)
399
+ };
400
+ // 发送
401
+ xhr.send();
402
+ });
403
+ },
404
+ // 图片 转base64
405
+ getBase64(file) {
406
+ return new Promise(function (resolve, reject) {
407
+ let reader = new FileReader();
408
+ let imgResult = "";
409
+ reader.readAsDataURL(file);
410
+ reader.onload = function () {
411
+ imgResult = reader.result;
412
+ };
413
+ reader.onerror = function (error) {
414
+ reject(error);
415
+ };
416
+ reader.onloadend = function () {
417
+ resolve(imgResult);
418
+ };
419
+ });
420
+ },
421
+ // 给图片添加水印
422
+ base64AddWaterMaker(base64Img, waterMakeConfig,type) {
423
+
424
+ // 保留this指向 后面会用到的
425
+ let vm = this;
426
+ return new Promise((resolve, reject) => {
427
+ let waterMaketext = waterMakeConfig.waterMakeText || "我是水印";
428
+ // let waterMaketext = "仅限投标使用,盖章有效"
429
+ let repeat = waterMakeConfig.repeat || true;
430
+ let fontSize = 30;
431
+ const canvas = document.createElement('canvas');
432
+ const ctx = canvas.getContext('2d');
433
+ const img = new Image();
434
+ img.crossOrigin = 'Anonymous'; // 图片加载的过程中允许出现跨域
435
+ // 先有src属性才会触发 onload函数
436
+ img.src = base64Img;
437
+ // 异步加载
438
+ img.onload = function () {
439
+ // 注意img.onload方法是异步的
440
+ canvas.width = img.width;
441
+ canvas.height = img.height;
442
+ vm.width = img.width;
443
+ vm.height = img.height;
444
+ // 以左上角为坐标原点 进行绘制图像
445
+ ctx.drawImage(img, 0, 0, img.width, img.height);
446
+ ctx.save();
447
+
448
+ let strWidth = 50;
449
+ let strHeight = 40;
450
+ strWidth = ctx.measureText(waterMaketext).width + 40;
451
+ strHeight = strHeight + 30;
452
+ ctx.fillStyle = "rgba(232,232,238,.8)";//设置文字颜色及透明度
453
+ ctx.rotate(-0.5); // 水印初始偏转角度
454
+ if (repeat) {
455
+ let moveX = strWidth * 3;
456
+ let moveY = 200;
457
+ ctx.font = fontSize + 'px 黑体';
458
+ for (let i = strWidth * 0.65 * -1; i < img.width; i += moveX) {
459
+ for (let j = strHeight; j < img.height * 2; j += moveY) {
460
+ ctx.fillText(waterMaketext, i, j);
461
+ ctx.save();
462
+ }
463
+ }
464
+ } else {
465
+ ctx.font = fontSize * 2 + 'px 黑体';
466
+ ctx.fillText(waterMaketext, img.width * 0.1, img.height * 0.85); //在图片上添加字体
467
+ ctx.save();
468
+ }
469
+ if(type=="view"){
470
+ let resultBase64 = canvas.toDataURL('image/png'); // 也是生成的base64格式的
471
+ if (!resultBase64) {
472
+ reject();
473
+ } else {
474
+ resolve(resultBase64);
475
+ }
476
+ }else if(type=="download"){
477
+ let imgType = "image/jpeg";
478
+ if(waterMakeConfig.fileType){
479
+ imgType = "image/"+waterMakeConfig.fileType;
480
+ }
481
+ canvas.toBlob((blob) => {
482
+ let link = document.createElement('a');
483
+ link.href = window.URL.createObjectURL(blob);
484
+ link.download = waterMakeConfig.fileName||'水印下载';
485
+ link.click();
486
+ link.remove();
487
+ resolve();
488
+ }, imgType);
489
+ }
490
+ };
491
+ });
492
+ },
493
+ /*
494
+ ** 复写原来的上传方法,去除原生的OPTIONS预检请求,
495
+ ** 系统不支持OPTIONS请求
496
+ */
497
+ uploadFileMethod(item) {
498
+ let vm = this;
499
+ let num = 0;
500
+ let uploadFileName = '\n'+item.file.name;
501
+ vm.stretchNum++;
502
+ vm.uploadLoadingText = vm.uploadLoadingText + uploadFileName + '( ' + num + '% )';
503
+ if (!vm.beforeUpload(item.file)) {
504
+ return;
505
+ }
506
+ let formData = new FormData();
507
+ formData.append("file", item.file);
508
+ formData.append("fkId", vm.fileFkId);
509
+ formData.append("extraPath", this.extraPath);
510
+ //创建axios实例
511
+ vm.axios.defaults.headers = null;
512
+ const axiosInstance = vm.axios.create({
513
+ baseURL: vm.uploadUrl,
514
+ headers: {
515
+ 'Content-Type': 'multipart/form-data',
516
+ Authorization: (this.USER_GLOBAL.getLoginToken() || "")
517
+ },
518
+ transformRequest: [
519
+ function (data) {
520
+ return data;
521
+ }
522
+ ],
523
+ });
524
+
525
+ vm.loading = true;
526
+ //上传文件
527
+ axiosInstance.post(vm.uploadUrl, formData ,{
528
+ onUploadProgress:(progressEvent)=>{
529
+ num = Number(((progressEvent.loaded / progressEvent.total) * 100).toFixed(0));
530
+ if(!vm.loading){
531
+ vm.loading = true;
532
+ }
533
+ let newUploadLoadArr = [];
534
+ vm.uploadLoadingText.split('\n').forEach(key => {
535
+ if(key.includes(item.file.name)){
536
+ key = item.file.name + '( ' + num + '% )';
537
+ }
538
+ newUploadLoadArr.push(key);
539
+ })
540
+ vm.uploadLoadingText = newUploadLoadArr.join('\n');
541
+ // vm.uploadLoadingText = '正在上传,请稍等...( ' + num + '% )'
542
+ }
543
+ }).then(function (res) {
544
+ vm.axios.defaults.headers = {
545
+ 'Content-Type': 'application/x-www-form-urlencoded',
546
+ common: {
547
+ Authorization: (localStorage["Authorization" + (window.projectSuffix || "")] || ""),
548
+ a: 1,
549
+ b: 2,
550
+ abc: 123
551
+ }
552
+ };
553
+
554
+ if (res.data && typeof res.data == "object" && !res.data.operateSuccess && !res.data.upload) {
555
+ vm.$message.error(res.data.message);
556
+ } else {
557
+ vm.uploadFileRecord && vm.uploadFileRecord(vm.field, "add", item.file.name,res.data.upload.id);
558
+ }
559
+ let updateUploadLoadArr = [];
560
+ vm.uploadLoadingText.split('\n').forEach(key => {
561
+ if(!key.includes(item.file.name)){
562
+ updateUploadLoadArr.push(key);
563
+ }
564
+ })
565
+ vm.uploadLoadingText = updateUploadLoadArr.join('\n');
566
+ if(vm.stretchNum > 0){
567
+ vm.stretchNum--;
568
+ }
569
+ vm.loading = false;
570
+ vm.initFiles();
571
+ }).catch(function (thrown) {
572
+ vm.axios.defaults.headers = {
573
+ 'Content-Type': 'application/x-www-form-urlencoded',
574
+ common: {
575
+ Authorization: (localStorage["Authorization" + (window.projectSuffix || "")] || ""),
576
+ a: 1,
577
+ b: 2,
578
+ abc: 123
579
+ }
580
+ };
581
+ });
582
+ },
583
+ /*
584
+ ** 附件上传成功后调用
585
+ */
586
+ onSuccess() {
587
+ this.$message("附件上传成功");
588
+ this.initFiles();
589
+ },
590
+ onExceed() {
591
+ this.$message("最大上传文件个数为:" + this.limit + ",无法继续上传!");
592
+ },
593
+ /*
594
+ ** 文件上传前调用
595
+ */
596
+ beforeUpload(file) {
597
+ Vue.set(file, "isPlay", false);
598
+ let fileSuffix = file.name.substring(file.name.lastIndexOf("."), file.name.length);
599
+ if (this.acceptFileType && this.acceptFileType.indexOf(fileSuffix) == -1) { // 判断上传类型
600
+ this.$message.error('不支持' + fileSuffix + '文件类型!');
601
+ this.fileTypeValid = false;
602
+ return false;
603
+ }
604
+ if (this.disableFileArr.length > 0 && this.disableFileArr.indexOf(fileSuffix) > -1) { // 判断上传类型
605
+ this.$message.error('不支持' + fileSuffix + '文件类型!');
606
+ this.fileTypeValid = false;
607
+ return false;
608
+ }
609
+ return true;
610
+ },
611
+
612
+ /**
613
+ * 临时删除
614
+ */
615
+ tempRemove(file) {
616
+ if (!this.fileTypeValid) {
617
+ this.fileTypeValid = true;
618
+ return;
619
+ }
620
+ if (!this.ifTempRemove) {
621
+ this.remove(file);
622
+ } else {
623
+ this.$confirm('是否确定删除此附件?', '警告', {
624
+ confirmButtonText: '确定',
625
+ cancelButtonText: '取消',
626
+ }).then(() => {
627
+ this.tempRemoveFile.push(file.id);
628
+ this.$emit('onFileRemoved', this.tempRemoveFile);
629
+ this.uploadFileRecord && this.uploadFileRecord(this.field, "delete", file.name,file.id);
630
+ this.initFiles();
631
+ }).catch(() => {
632
+ this.$message({
633
+ type: 'info',
634
+ message: '已取消删除'
635
+ });
636
+ });
637
+ }
638
+ },
639
+
640
+ /*
641
+ ** 文件删除
642
+ */
643
+ remove(file) {
644
+ let vm = this;
645
+ // beforeUpload上传时验证失败不触发这里的删除方法
646
+ if (!vm.fileTypeValid) {
647
+ vm.fileTypeValid = true;
648
+ return;
649
+ }
650
+ vm.$confirm('是否确定删除此附件?', '警告', {
651
+ confirmButtonText: '确定',
652
+ cancelButtonText: '取消',
653
+ }).then(function () {
654
+ vm.axios.post(vm.api.baseUploadUrl + "delete", {"ids": file.id}).then(function () {
655
+ vm.$message.success("附件删除成功!");
656
+ vm.initFiles();
657
+ });
658
+ }).catch(function () {
659
+ vm.$message({
660
+ type: 'info',
661
+ message: '已取消删除'
662
+ });
663
+ vm.initFiles();
664
+ });
665
+ },
666
+ /*
667
+ ** 预览文件
668
+ */
669
+ previewFile(file, index) {
670
+ const type = file.extension.toLowerCase();
671
+ if (type === "jpg" || type === "jpeg" || type === "png") {
672
+ this.previewImg(file, index);
673
+ } else {
674
+ const dtype = this.objExtensionToImgType[type].toLowerCase();
675
+ if (dtype === 'word' || dtype === 'excel' ||
676
+ dtype === 'powerpoint' || dtype === 'pdf') {
677
+ this.previewDoc(type, file.id);
678
+ } else if (dtype === 'video') {
679
+ this.previewAudiovisual(type, file);
680
+ } else if (dtype === 'sound') {
681
+ this.previewPlaySound(type, file);
682
+ }
683
+ }
684
+ },
685
+ /*
686
+ ** 预览图片
687
+ */
688
+ previewImg(file, index) {
689
+ const viewer = this.$el.querySelector('#viewer-selection').$viewer;
690
+ viewer.images = viewer.images.filter(data => {
691
+ if (data.currentSrc.indexOf("static/images/upload") == -1) {
692
+ return data;
693
+ }
694
+ });
695
+ viewer.index = index;
696
+ viewer.options.hide = () => {
697
+ // 不延时关闭的话会影响原dialog隐藏显示
698
+ setTimeout(() => {
699
+ this.tempDialogVisible = false;
700
+ });
701
+ };
702
+ viewer.show();
703
+ this.tempDialogVisible = true;
704
+ },
705
+ /*
706
+ ** 预览文档
707
+ */
708
+ previewDoc(type, fjid) {
709
+ let fjType = '';
710
+ switch (type) {
711
+ case 'doc':
712
+ case 'docx':
713
+ case 'txt':
714
+ fjType = 'document';
715
+ break;
716
+ case 'xls':
717
+ case 'xlsx':
718
+ fjType = 'excel';
719
+ break;
720
+ case 'ppt':
721
+ case 'pptx':
722
+ fjType = 'powerPoint';
723
+ break;
724
+ case 'pdf':
725
+ fjType = 'pdf';
726
+ break;
727
+ }
728
+ const routeData = this.$router.resolve({
729
+ path: '/pdfViewer',
730
+ query: {fjid: fjid, fjType: fjType}
731
+ });
732
+ window.open(routeData.href, '_blank');
733
+ },
734
+ /*
735
+ ** 预览视频
736
+ */
737
+ previewAudiovisual(type, file) {
738
+ this.preview.audiovisualSrc = '';
739
+ const dtype = this.objExtensionToImgType[type];
740
+ this.preview.audiovisualDialogVisible = true;
741
+ // if (dtype === 'video') {
742
+ this.preview.audiovisualSrc = file.downloadUrl;
743
+ this.preview.audiovisualType = 'video/' + type.toLowerCase();
744
+ //自动播放
745
+ this.$nextTick(() => {
746
+ const $player = this.$refs.videoRef.dp;
747
+ (this.preview.audiovisualId !== file.id) && $player.switchVideo({
748
+ url: file.downloadUrl
749
+ });
750
+ $player.paused && $player.play();
751
+ this.preview.audiovisualId = file.id;
752
+ });
753
+ // }
754
+ },
755
+ /*
756
+ **播放音频
757
+ */
758
+ previewPlaySound(type, file) {
759
+ let audio = this.$refs.aplayer;
760
+ if (this.ap.container) {
761
+ if (!this.ap.audio.paused) {
762
+ this.ap.pause();
763
+ this.clickText = '播放';
764
+ this.icon = "el-icon-video-play";
765
+ this.type = "success";
766
+ } else {
767
+ this.ap.play();
768
+ this.clickText = '暂停';
769
+ this.icon = "el-icon-video-pause";
770
+ this.type = "danger";
771
+ }
772
+ } else {
773
+ const abc = new APlayer({
774
+ container: audio,
775
+ audio: {
776
+ url: file.downloadUrl,
777
+ }
778
+ });
779
+ abc.play();
780
+ this.clickText = '暂停';
781
+ this.icon = "el-icon-video-pause";
782
+ this.type = "danger";
783
+ this.ap = abc;
784
+ }
785
+ },
786
+ /*
787
+ ** 音/视频预览窗口关闭前调用
788
+ */
789
+ audiovisualBeforeClose(done) {
790
+ const $player = this.$refs.videoRef.dp;
791
+ !$player.paused && $player.pause();
792
+ done();
793
+ },
794
+ /*
795
+ ** 下载文件
796
+ */
797
+ downLoadWaterMarkFile(){
798
+ if(!this.checkWaterMarkText){
799
+ this.$message.error("请选择水印模板!");
800
+ return false;
801
+ }
802
+ if(this.checkWaterMarkText||!this.waterdialogVisible){
803
+ this.getImageFileFromUrl(this.downloadWaterMake.fileUrl, this.downloadWaterMake.fileName)
804
+ .then((response) => {
805
+ // 返回的是文件对象,使用变量接收即可
806
+ try {
807
+ this.getBase64(response).then((imgResult) => {
808
+ let waterMake = {
809
+ waterMakeText: this.checkWaterMarkText||this.downloadWaterMake.waterMakeText,
810
+ fileName:this.downloadWaterMake.fileName,
811
+ fileType:this.downloadWaterMake.fileType
812
+ }
813
+ this.base64AddWaterMaker(imgResult, waterMake,"download").then((res) => {
814
+ // 这里可以把添加水印后的文件传给后端,我这里只是举例并没有做
815
+ this.downloadWaterMake={
816
+ waterMakeText: this.waterMakeConfig.defaultWaterMake,
817
+ fileName:"",
818
+ fileType:"png",
819
+ fileUrl:""
820
+ }
821
+ this.waterdialogVisible = false;
822
+ });
823
+ })
824
+ } catch (error) {
825
+ this.waterdialogVisible = false;
826
+ console.log('error:', error);
827
+ }
828
+ })
829
+ .catch((e) => {
830
+ this.waterdialogVisible = false;
831
+ console.error(e);
832
+ })
833
+ }
834
+
835
+ },
836
+ downloadFile(url, file) {
837
+ let type = file?file.extension:"";
838
+ let fileName = file?file.name:"";
839
+ if (this.hasWater && (type === "jpg" || type === "jpeg" || type === "png")) {
840
+ this.downloadWaterMake={
841
+ waterMakeText: this.waterMakeConfig.defaultWaterMake,
842
+ fileName:fileName,
843
+ fileType:type,
844
+ fileUrl:url
845
+ }
846
+ //获取系统参数
847
+ if (this.downInstructions) {
848
+ //弹出confime
849
+ this.$prompt('请填写用途', '提示', {
850
+ confirmButtonText: '确定',
851
+ cancelButtonText: '取消',
852
+ inputPattern: /\S/,
853
+ inputValidator: this.validatorXzsm,
854
+ inputErrorMessage: '用途不能为空!'
855
+ }).then(({value}) => {
856
+ if(this.waterMakeConfig.waterArr&&this.waterMakeConfig.waterArr.length>0){
857
+ this.waterdialogVisible = true;
858
+ }else{
859
+ this.downLoadWaterMarkFile();
860
+ }
861
+ let loginUser = this.USER_GLOBAL.getLoginUser();
862
+ let downLoadUser = "&&";
863
+ if (loginUser && loginUser.id) {
864
+ downLoadUser = loginUser.id;
865
+ }
866
+ this.axios.post(this.api.upload.addUploadLog,
867
+ {"fkId": this.fkId,"id":file.id,"fileName":fileName,
868
+ "downloadUser":downLoadUser,"xzsm":value})
869
+ });
870
+ }else{
871
+ if(this.waterMakeConfig.waterArr&&this.waterMakeConfig.waterArr.length>0){
872
+ this.waterdialogVisible = true;
873
+ }else{
874
+ this.downLoadWaterMarkFile();
875
+ }
876
+ }
877
+
878
+ } else {
879
+ this.uploadPrompt(url);
880
+ }
881
+ },
882
+ uploadPrompt(url) {
883
+ let loginUser = this.USER_GLOBAL.getLoginUser();
884
+ let downLoadUser = "&&";
885
+ if (loginUser && loginUser.id) {
886
+ downLoadUser = loginUser.id;
887
+ }
888
+ url = url + "&downloadUser=" + downLoadUser;
889
+ //获取系统参数
890
+ if (this.downInstructions) {
891
+ //弹出confime
892
+ this.$prompt('请填写用途', '提示', {
893
+ confirmButtonText: '确定',
894
+ cancelButtonText: '取消',
895
+ inputPattern: /\S/,
896
+ inputValidator: this.validatorXzsm,
897
+ inputErrorMessage: '用途不能为空!'
898
+ }).then(({value}) => {
899
+ url = url + "&xzsm=" + value;
900
+ this.startUpload(url);
901
+ });
902
+ } else {
903
+ this.startUpload(url);
904
+ }
905
+ },
906
+ /**
907
+ * 开始下载
908
+ * @param url
909
+ */
910
+ startUpload(url) {
911
+ let link = document.createElement('a');
912
+ link.setAttribute('href', url);
913
+ link.click();
914
+ link = null;
915
+ },
916
+
917
+
918
+ /**
919
+ * 下载说明
920
+ * @param value
921
+ */
922
+ validatorXzsm(value) {
923
+ if (!value) {
924
+ return "下载说明不能为空!";
925
+ }
926
+ },
927
+ }
928
+ }
929
+ </script>
930
+
931
+ <style scoped lang="scss">
932
+ .pl-upload-container {
933
+
934
+ .pl-flie-list {
935
+ text-align: left;
936
+
937
+ .pl-file-list-item {
938
+ vertical-align: top;
939
+ display: inline-block;
940
+ width: 135px;
941
+ height: 135px;
942
+ margin-right: 8px;
943
+ margin-top: 8px;
944
+ border-radius: 2px;
945
+ border: 1px solid #c0ccda;
946
+ cursor: pointer;
947
+ transition: all 0.3s;
948
+ position: relative;
949
+
950
+ .pl-file-list-item-btn {
951
+ display: none;
952
+ transition: all 0.3s;
953
+ background: rgba(0, 0, 0, 0.2);
954
+
955
+ .top-btn {
956
+ position: absolute;
957
+ top: 0;
958
+ right: 5px;
959
+ text-align: right;
960
+
961
+ .btn-close {
962
+ color: black;
963
+
964
+ &:hover {
965
+ color: red;
966
+ }
967
+ }
968
+ }
969
+
970
+ .center-btn {
971
+ display: inline-block;
972
+ text-align: center;
973
+ width: 100%;
974
+ vertical-align: middle;
975
+
976
+ /deep/ {
977
+ .el-button {
978
+ margin: 5px;
979
+ }
980
+ }
981
+ }
982
+
983
+ &:after {
984
+ content: "";
985
+ display: inline-block;
986
+ height: 100%;
987
+ vertical-align: middle;
988
+ }
989
+ }
990
+
991
+ &:hover {
992
+ .pl-file-list-item-btn {
993
+ display: block;
994
+ }
995
+ }
996
+
997
+ .pl-file-list-item-img {
998
+ /*width: 70px;*/
999
+ height: 70px;
1000
+ margin: 14px 31.5px 0 31.5px;
1001
+
1002
+ img {
1003
+ width: 70px;
1004
+ height: 70px;
1005
+ }
1006
+ }
1007
+
1008
+ .pl-file-list-item-text {
1009
+ margin: 8px 4px;
1010
+ text-align: center;
1011
+ text-overflow: ellipsis;
1012
+ width: 125px;
1013
+ white-space: nowrap;
1014
+ overflow: hidden;
1015
+ }
1016
+ }
1017
+ }
1018
+
1019
+ .upload-menu {
1020
+ position: absolute;
1021
+ display: inline-block;
1022
+
1023
+ .menu-li {
1024
+ float: left;
1025
+ height: 25px;
1026
+ line-height: 25px;
1027
+ text-align: center;
1028
+ font-size: 12px;
1029
+ padding-right: 3px;
1030
+ cursor: pointer;
1031
+
1032
+ &:hover {
1033
+ color: #00AFE4;
1034
+ }
1035
+ }
1036
+ }
1037
+ }
1038
+
1039
+ .upload-info-message {
1040
+ color: red;
1041
+ }
1042
+
1043
+ .pl-upload-temp-dialog {
1044
+ width: 0;
1045
+ height: 0;
1046
+ }
1047
+
1048
+ /* 修改音/视频dialog样式 */
1049
+ /deep/ .pl-audiovisual-dialog {
1050
+ background-color: #000;
1051
+
1052
+ .el-dialog__headerbtn {
1053
+ font-size: 25px;
1054
+ top: 0;
1055
+ right: 0;
1056
+ width: 30px;
1057
+ height: 30px;
1058
+ z-index: 99;
1059
+
1060
+ .el-dialog__close {
1061
+ display: flex;
1062
+ align-items: center;
1063
+ justify-content: center;
1064
+ color: white;
1065
+
1066
+ &:hover {
1067
+ color: red;
1068
+ }
1069
+ }
1070
+ }
1071
+
1072
+ .el-dialog__header {
1073
+ padding: 0;
1074
+ border-bottom: none;
1075
+ }
1076
+
1077
+ .el-dialog__body {
1078
+ display: flex;
1079
+ justify-content: center;
1080
+ align-items: center;
1081
+ padding: 0;
1082
+ background-color: #000;
1083
+ }
1084
+ }
1085
+
1086
+ /deep/ .el-upload-list--picture a.el-upload-list__item-name {
1087
+ width: 125px;
1088
+ display: inline-block;
1089
+ margin: 10px 4px;
1090
+ padding: 0px;
1091
+ text-align: center;
1092
+ vertical-align: middle;
1093
+ line-height: 19px;
1094
+ cursor: pointer;
1095
+ }
1096
+
1097
+ /deep/ .el-upload-list--picture li.el-upload-list__item {
1098
+ height: 135px;
1099
+ width: 135px;
1100
+ padding: 0px;
1101
+ float: left;
1102
+ margin-right: 10px;
1103
+ }
1104
+
1105
+ /deep/ .el-upload-list--picture .el-upload-list__item-name i {
1106
+ display: none;
1107
+ }
1108
+
1109
+ /deep/ .el-upload-list--picture .el-upload-list__item-thumbnail {
1110
+ position: inherit;
1111
+ margin: 14px 31.5px 0 31.5px;
1112
+ cursor: pointer;
1113
+ }
1114
+
1115
+ /deep/ li.el-list-enter-to, /deep/ li.el-list-leave-to, /deep/ li.el-list-enter-active, /deep/ li.el-list-leave-active {
1116
+ transition: none;
1117
+ }
1118
+ </style>
1119
+
1120
+ <style>
1121
+ .pl-upload-container .el-upload, .pl-upload-container .el-upload-dragger {
1122
+ width: 100%;
1123
+ }
1124
+ </style>