n20-common-lib 1.2.43 → 1.2.46

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 (193) hide show
  1. package/README.md +2 -2
  2. package/package.json +88 -88
  3. package/src/_qiankun/index.js +113 -113
  4. package/src/_qiankun/postMessage.js +48 -48
  5. package/src/assets/css/_coreLib.scss +35 -35
  6. package/src/assets/css/cl-anchor.scss +23 -23
  7. package/src/assets/css/cl-approve-card.scss +58 -58
  8. package/src/assets/css/cl-dialog.scss +99 -99
  9. package/src/assets/css/cl-drag-list.scss +22 -22
  10. package/src/assets/css/cl-empty.scss +10 -10
  11. package/src/assets/css/cl-expandable-pane.scss +26 -26
  12. package/src/assets/css/cl-expandable.scss +24 -24
  13. package/src/assets/css/cl-file-upload-table.scss +11 -11
  14. package/src/assets/css/cl-filter.scss +4 -4
  15. package/src/assets/css/cl-flow-step.scss +185 -185
  16. package/src/assets/css/cl-footer-box.scss +10 -10
  17. package/src/assets/css/cl-form-item.scss +612 -612
  18. package/src/assets/css/cl-general-card.scss +11 -11
  19. package/src/assets/css/cl-layout-aside.scss +92 -92
  20. package/src/assets/css/cl-layout-content.scss +16 -16
  21. package/src/assets/css/cl-layout-header.scss +73 -73
  22. package/src/assets/css/cl-layout-tabs.scss +87 -87
  23. package/src/assets/css/cl-layout.scss +97 -97
  24. package/src/assets/css/cl-login-temporary.scss +37 -37
  25. package/src/assets/css/cl-message.scss +75 -75
  26. package/src/assets/css/cl-more-tab.scss +98 -98
  27. package/src/assets/css/cl-nav-menu.scss +5 -5
  28. package/src/assets/css/cl-pagination.scss +128 -128
  29. package/src/assets/css/cl-secondary-tab.scss +53 -53
  30. package/src/assets/css/cl-showcolumn.scss +23 -23
  31. package/src/assets/css/cl-sifting.scss +51 -51
  32. package/src/assets/css/cl-statis.scss +42 -42
  33. package/src/assets/css/cl-step.scss +73 -73
  34. package/src/assets/css/cl-suspend.scss +19 -19
  35. package/src/assets/css/cl-tertiary-tab.scss +54 -54
  36. package/src/assets/css/cl-upload.scss +41 -41
  37. package/src/assets/css/cl-worn-pagination.scss +50 -50
  38. package/src/assets/css/el-button.scss +173 -173
  39. package/src/assets/css/el-table.scss +79 -79
  40. package/src/assets/css/element-variables.scss +1061 -1061
  41. package/src/assets/css/element.dev.scss +21 -21
  42. package/src/assets/css/font-icon.scss +27 -27
  43. package/src/assets/css/index.dev.scss +4 -4
  44. package/src/assets/css/index.scss +11 -11
  45. package/src/assets/css/normalize.scss +726 -726
  46. package/src/assets/css/rootvar.scss +139 -139
  47. package/src/assets/css/select.scss +25 -25
  48. package/src/assets/css/title-pop.scss +4 -4
  49. package/src/assets/getJsonc.js +50 -50
  50. package/src/assets/realUrl.js +12 -12
  51. package/src/components/.DS_Store +0 -0
  52. package/src/components/Anchor/AnchorItem.vue +29 -29
  53. package/src/components/Anchor/index.vue +185 -185
  54. package/src/components/ApprovalButtons/index.vue +233 -233
  55. package/src/components/ApprovalCard/index.vue +128 -128
  56. package/src/components/ApprovalRecord/approvalImg.vue +44 -44
  57. package/src/components/ApprovalRecord/flowDialog.vue +45 -45
  58. package/src/components/ApprovalRecord/index.vue +59 -59
  59. package/src/components/Button/button-group.vue +150 -150
  60. package/src/components/Button/icon-group-button.vue +61 -61
  61. package/src/components/Button/index.vue +56 -56
  62. package/src/components/CascaderArea/index.vue +103 -103
  63. package/src/components/ContentLoading/index.vue +41 -41
  64. package/src/components/ContentNull/index.vue +19 -19
  65. package/src/components/DatePicker/index.vue +27 -27
  66. package/src/components/DatePicker/por.vue +169 -169
  67. package/src/components/Dialog/index.vue +26 -26
  68. package/src/components/Dialog/indexO.vue +116 -116
  69. package/src/components/DragList/index.vue +75 -75
  70. package/src/components/Empty/.DS_Store +0 -0
  71. package/src/components/Empty/img/.DS_Store +0 -0
  72. package/src/components/Empty/img/abnormal.svg +108 -108
  73. package/src/components/Empty/img/dispose.svg +71 -71
  74. package/src/components/Empty/img/empty.svg +57 -57
  75. package/src/components/Empty/img/general.svg +58 -58
  76. package/src/components/Empty/img/lock.svg +57 -57
  77. package/src/components/Empty/img/network.svg +59 -59
  78. package/src/components/Empty/img/relevant.svg +68 -68
  79. package/src/components/Empty/img/search.svg +72 -72
  80. package/src/components/Empty/index.vue +92 -92
  81. package/src/components/Expandable/index.vue +49 -49
  82. package/src/components/Expandable/main.vue +52 -52
  83. package/src/components/FileExportAsync/index.vue +178 -178
  84. package/src/components/FileUploadTable/index.vue +484 -484
  85. package/src/components/Filters/index.vue +371 -371
  86. package/src/components/Filters/indexO.vue +104 -104
  87. package/src/components/FlowStep/index.vue +68 -68
  88. package/src/components/FooterBox/index.vue +21 -21
  89. package/src/components/GeneralCard/index.vue +15 -15
  90. package/src/components/InputNumber/index.vue +169 -169
  91. package/src/components/InputNumber/numberRange.vue +47 -47
  92. package/src/components/InputSearch/index.vue +75 -75
  93. package/src/components/Layout/.DS_Store +0 -0
  94. package/src/components/Layout/AsideNav/index.vue +120 -120
  95. package/src/components/Layout/AsideNav/menuItem.vue +34 -34
  96. package/src/components/Layout/AsideNav/submenuTitle.vue +26 -26
  97. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -215
  98. package/src/components/Layout/HeaderWrap/index.vue +371 -371
  99. package/src/components/Layout/HeaderWrap/noticePop.vue +316 -316
  100. package/src/components/Layout/SubContent/index.vue +127 -127
  101. package/src/components/Layout/TabsNav/index.vue +170 -170
  102. package/src/components/Layout/index.vue +518 -518
  103. package/src/components/Layout/utils.js +12 -12
  104. package/src/components/LoginTemporary/form.vue +566 -566
  105. package/src/components/LoginTemporary/index.vue +139 -139
  106. package/src/components/LoginTemporary/qrcode.vue +90 -90
  107. package/src/components/LoginTemporary/retrievePw.vue +372 -372
  108. package/src/components/LoginTemporary/utils.js +73 -73
  109. package/src/components/MicroApp/index.js +67 -67
  110. package/src/components/MicroFrame/index.vue +95 -95
  111. package/src/components/MoreTab/index.vue +232 -232
  112. package/src/components/NavMenu/index.vue +60 -60
  113. package/src/components/NstcG6Components/.DS_Store +0 -0
  114. package/src/components/PageLayout/page.vue +15 -15
  115. package/src/components/Pagination/index.vue +165 -165
  116. package/src/components/SecondaryTab/index.vue +58 -58
  117. package/src/components/SelectLazy/index.vue +75 -75
  118. package/src/components/SelectTree/SelectTreeLazy.vue +241 -241
  119. package/src/components/SelectTree/index.vue +205 -205
  120. package/src/components/ShowColumn/index.vue +213 -213
  121. package/src/components/Sifting/index.vue +99 -99
  122. package/src/components/Statis/index.vue +97 -97
  123. package/src/components/Statis/statisItem.vue +54 -54
  124. package/src/components/Statis/statisPopover.vue +55 -55
  125. package/src/components/Step/index.vue +38 -38
  126. package/src/components/Suspend/index.vue +72 -72
  127. package/src/components/Table/index.vue +209 -209
  128. package/src/components/Table/indexO.vue +149 -149
  129. package/src/components/Task/index.vue +26 -26
  130. package/src/components/TertiaryTab/index.vue +63 -63
  131. package/src/components/TimePicker/index.vue +28 -28
  132. package/src/components/Upload/index.vue +242 -242
  133. package/src/components/WornPagination/index.vue +73 -73
  134. package/src/directives/VClickOutside/index.js +19 -19
  135. package/src/directives/VHas/index.js +58 -58
  136. package/src/directives/VMove/index.js +42 -42
  137. package/src/directives/VTitle/index.js +69 -69
  138. package/src/directives/VTitle/tooltip.vue +21 -21
  139. package/src/index.js +232 -232
  140. package/src/plugins/CompatibleOld/index.js +57 -57
  141. package/src/plugins/Print/index.js +4 -4
  142. package/src/plugins/Print/print-js/.babelrc +12 -12
  143. package/src/plugins/Print/print-js/LICENSE +21 -21
  144. package/src/plugins/Print/print-js/README.md +98 -98
  145. package/src/plugins/Print/print-js/dist/print.css +96 -96
  146. package/src/plugins/Print/print-js/dist/print.js +990 -990
  147. package/src/plugins/Print/print-js/package.json +60 -60
  148. package/src/plugins/Print/print-js/src/index.d.ts +45 -45
  149. package/src/plugins/Print/print-js/src/index.js +10 -10
  150. package/src/plugins/Print/print-js/src/js/browser.js +33 -33
  151. package/src/plugins/Print/print-js/src/js/functions.js +103 -103
  152. package/src/plugins/Print/print-js/src/js/html.js +70 -70
  153. package/src/plugins/Print/print-js/src/js/image.js +48 -48
  154. package/src/plugins/Print/print-js/src/js/init.js +168 -168
  155. package/src/plugins/Print/print-js/src/js/json.js +109 -109
  156. package/src/plugins/Print/print-js/src/js/modal.js +62 -62
  157. package/src/plugins/Print/print-js/src/js/pdf.js +62 -62
  158. package/src/plugins/Print/print-js/src/js/print.js +102 -102
  159. package/src/plugins/Print/print-js/src/js/raw-html.js +15 -15
  160. package/src/plugins/Print/print-js/src/sass/index.scss +13 -13
  161. package/src/plugins/Print/print-js/src/sass/modules/_colors.scss +9 -9
  162. package/src/plugins/Print/print-js/src/sass/partials/_modal.scss +40 -40
  163. package/src/plugins/Print/print-js/src/sass/partials/_spinner.scss +45 -45
  164. package/src/plugins/Print/print.js +2 -2
  165. package/src/plugins/Print/print.scss +1 -1
  166. package/src/plugins/SetMenuTree/index.vue +41 -41
  167. package/src/plugins/SetMenuTree/logoIcon.vue +37 -37
  168. package/src/plugins/SetMenuTree/setmenutree.vue +427 -427
  169. package/src/plugins/SetMenuTree/utils.js +74 -74
  170. package/src/plugins/Sign/InfosecNetSignCNGAgent.min.js +2000 -2000
  171. package/src/plugins/Sign/index.js +65 -65
  172. package/src/plugins/Sign/sign.js +1 -1
  173. package/src/plugins/setTabsForSub.js +2 -2
  174. package/src/utils/auth.js +53 -53
  175. package/src/utils/axios.js +203 -203
  176. package/src/utils/downloadBlob.js +19 -19
  177. package/src/utils/forEachs.js +16 -16
  178. package/src/utils/getScrollContainer.js +43 -43
  179. package/src/utils/i18n/cn2hk.json +1270 -1270
  180. package/src/utils/i18n/index.js +50 -50
  181. package/src/utils/list2tree.js +36 -36
  182. package/src/utils/msgboxPor.js +26 -26
  183. package/src/utils/print.js +161 -161
  184. package/src/utils/relaNo.js +72 -72
  185. package/src/utils/repairElementUI.js +95 -95
  186. package/src/utils/urlToGo.js +82 -82
  187. package/style/index.css +3 -3
  188. package/style/css/normalize.scss +0 -726
  189. package/style/pageDemo/demo-1.vue +0 -131
  190. package/style/pageDemo/demo-2.vue +0 -35
  191. package/style/pageDemo/demo-3.vue +0 -22
  192. package/style/pageDemo/seeCode.js +0 -20
  193. package/style/server-config.jsonc +0 -606
@@ -1,484 +1,484 @@
1
- <template>
2
- <div class="bd-t bd-l bd-r">
3
- <!-- 查看附件信息 -->
4
- <template v-if="readonly">
5
- <div class="p-l p-r p-t-s p-b-s">
6
- <div class="flex-box flex-v flex-lr">
7
- <span><slot name="title">附件信息</slot></span>
8
- <slot v-if="tableData.length" name="down-btn">
9
- <el-button size="mini" plain @click="downRows">批量下载</el-button>
10
- </slot>
11
- </div>
12
- </div>
13
-
14
- <el-table
15
- :data="tableData"
16
- :row-key="keys.rowKey"
17
- @selection-change="(selection) => (selectionList = selection)"
18
- >
19
- <slot name="selection-column"
20
- ><el-table-column type="selection" width="50" align="center" />
21
- </slot>
22
- <el-table-column label="附件类型" :prop="keys.type">
23
- <template slot="header" slot-scope="scope">
24
- <slot name="type-header" :column="scope.column">附件类型</slot>
25
- </template>
26
- <template slot-scope="{ row }">
27
- <slot name="type" :row="row">{{
28
- row[keys.type] | typeFiter(typeOptions)
29
- }}</slot>
30
- </template>
31
- </el-table-column>
32
- <el-table-column label="附件名称" :prop="keys.name">
33
- <template slot="header" slot-scope="scope">
34
- <slot name="name-header" :column="scope.column">附件名称</slot>
35
- </template>
36
- <template slot-scope="{ row }">
37
- <slot name="name" :row="row">{{ row[keys.name] }}</slot>
38
- </template>
39
- </el-table-column>
40
- <el-table-column label="上传时间" :prop="keys.time" align="center">
41
- <template slot="header" slot-scope="scope">
42
- <slot name="time-header" :column="scope.column">上传时间</slot>
43
- </template>
44
- <template slot-scope="{ row }">
45
- <slot name="time" :row="row">{{ row[keys.time] }}</slot>
46
- </template>
47
- </el-table-column>
48
- <el-table-column label="上传人" :prop="keys.user">
49
- <template slot="header" slot-scope="scope">
50
- <slot name="user-header" :column="scope.column">上传人</slot>
51
- </template>
52
- <template slot-scope="{ row }">
53
- <slot name="user" :row="row">{{ row[keys.user] }}</slot>
54
- </template>
55
- </el-table-column>
56
- <el-table-column label="操作" align="center" width="80">
57
- <template slot="header" slot-scope="scope">
58
- <slot name="handle-header" :column="scope.column">操作</slot>
59
- </template>
60
- <template slot-scope="{ row }">
61
- <slot name="handle" :row="row">
62
- <el-button
63
- type="text"
64
- icon="el-icon-view"
65
- @click="seeFile(row)"
66
- />
67
- <el-button
68
- type="text"
69
- icon="el-icon-download"
70
- :disabled="!row[keys.url]"
71
- @click="downFile(row)"
72
- />
73
- </slot>
74
- </template>
75
- </el-table-column>
76
- </el-table>
77
- </template>
78
- <!-- 上传附件 -->
79
- <template v-else>
80
- <div class="p-l p-r p-t-s p-b-s">
81
- <div class="flex-box flex-v flex-lr">
82
- <span><slot name="title">附件信息</slot></span>
83
- <div>
84
- <slot name="add-btn">
85
- <el-button type="primary" size="mini" @click="addRow"
86
- >新增</el-button
87
- >
88
- </slot>
89
- <slot v-if="tableData.length" name="down-btn">
90
- <el-button size="mini" plain @click="downRows">下载</el-button>
91
- </slot>
92
- <slot v-if="tableData.length" name="delete-btn">
93
- <el-button type="danger" plain size="mini" @click="deleteRows"
94
- >删除</el-button
95
- >
96
- </slot>
97
- </div>
98
- </div>
99
- </div>
100
-
101
- <el-table
102
- :data="tableData"
103
- :row-key="keys.rowKey"
104
- @selection-change="(selection) => (selectionList = selection)"
105
- >
106
- <slot name="selection-column"
107
- ><el-table-column type="selection" width="50" align="center" />
108
- </slot>
109
- <el-table-column label="附件类型" min-width="160">
110
- <template slot="header" slot-scope="scope">
111
- <slot name="type-header" :column="scope.column">附件类型</slot>
112
- </template>
113
- <template slot-scope="{ row }">
114
- <slot name="type" :row="row">
115
- <el-select
116
- v-model="row[keys.type]"
117
- :disabled="row['_typeDisabled']"
118
- placeholder="请选择附件类型"
119
- style="width: 100%"
120
- >
121
- <el-option
122
- v-for="item in typeOptions"
123
- :key="item.type"
124
- :disabled="item.disabled"
125
- :value="item.type"
126
- :label="item.label"
127
- />
128
- </el-select>
129
- </slot>
130
- </template>
131
- </el-table-column>
132
- <el-table-column label="附件名称" min-width="160">
133
- <template slot="header" slot-scope="scope">
134
- <slot name="name-header" :column="scope.column">附件名称</slot>
135
- </template>
136
- <template slot-scope="{ row }">
137
- <slot name="name" :row="row">
138
- <el-input v-model="row[keys.name]" />
139
- </slot>
140
- </template>
141
- </el-table-column>
142
- <el-table-column label="附件上传" min-width="160">
143
- <template slot="header" slot-scope="scope">
144
- <slot name="upload-header" :column="scope.column">附件上传</slot>
145
- </template>
146
- <template slot-scope="{ row, $index }">
147
- <slot name="upload" :row="row" :$index="$index">
148
- <clUpload
149
- :ref="'upload' + $index"
150
- class="n20-upload-table-up"
151
- :file-name="row['_name'] || row[keys.name]"
152
- :data="row['_fileData']"
153
- :msg-type="null"
154
- :show-clear="false"
155
- :action="action"
156
- :headers="headers"
157
- :disabled="!row[keys.type]"
158
- :accept="row[keys.type] | acceptFilter(typeOptions, fileAccept)"
159
- :size="row[keys.type] | sizeFilter(typeOptions, fileSize)"
160
- :before-upload="(file) => beforeUploadFn(file, row)"
161
- :on-progress="(event) => onProgressFn(event, row)"
162
- :on-success="
163
- (response, file, fileList) =>
164
- onSuccessFn(response, file, fileList, row)
165
- "
166
- :on-error="
167
- (err, file, fileList) =>
168
- errorFn(err, file, fileList, row, $index)
169
- "
170
- />
171
- </slot>
172
- </template>
173
- </el-table-column>
174
- <el-table-column
175
- label="上传时间"
176
- :prop="keys.time"
177
- width="160"
178
- align="center"
179
- >
180
- <template slot="header" slot-scope="scope">
181
- <slot name="time-header" :column="scope.column">上传时间</slot>
182
- </template>
183
- <template slot-scope="{ row }">
184
- <slot name="time" :row="row">{{ row[keys.time] }}</slot>
185
- </template>
186
- </el-table-column>
187
- <el-table-column label="上传人" :prop="keys.user">
188
- <template slot="header" slot-scope="scope">
189
- <slot name="user-header" :column="scope.column">上传人</slot>
190
- </template>
191
- <template slot-scope="{ row }">
192
- <slot name="user" :row="row">{{ row[keys.user] }}</slot>
193
- </template>
194
- </el-table-column>
195
- <el-table-column label="上传进度" width="220">
196
- <template slot="header" slot-scope="scope">
197
- <slot name="percent-header" :column="scope.column">上传进度</slot>
198
- </template>
199
- <template slot-scope="{ row, $index }">
200
- <slot name="percent" :row="row" :$index="$index">
201
- <div v-if="row['_percent'] >= 0" class="flex-box flex-v">
202
- <el-progress
203
- class="n20-upload-table-progress"
204
- :percentage="row['_percent']"
205
- :status="row['_status']"
206
- style="width: 140px"
207
- />
208
- <el-button
209
- v-if="row['_status'] === 'exception'"
210
- type="text"
211
- size="mini"
212
- style="width: 60px"
213
- @click="anewSubmitFn(row, $index)"
214
- >重新上传</el-button
215
- >
216
- <el-button
217
- v-else-if="row['_percent'] >= 0 && row['_percent'] < 100"
218
- type="text"
219
- size="mini"
220
- style="width: 60px"
221
- @click="abortFn(row, $index)"
222
- >取消</el-button
223
- >
224
- </div>
225
- </slot>
226
- </template>
227
- </el-table-column>
228
- <el-table-column label="操作" align="center" width="80">
229
- <template slot="header" slot-scope="scope">
230
- <slot name="handle-header" :column="scope.column">操作</slot>
231
- </template>
232
- <template slot-scope="{ row }">
233
- <slot name="handle" :row="row">
234
- <el-button
235
- type="text"
236
- icon="el-icon-view"
237
- :disabled="!row[keys.url]"
238
- @click="seeFile(row)"
239
- />
240
- </slot>
241
- </template>
242
- </el-table-column>
243
- </el-table>
244
- </template>
245
-
246
- <el-dialog
247
- class="p-a-0"
248
- title="附件预览"
249
- :visible.sync="visibleP"
250
- top="2vh"
251
- width="96%"
252
- append-to-body
253
- @close="closeSee"
254
- >
255
- <div
256
- v-if="imgType.test(previewName)"
257
- class="p-a flex-box flex-c flex-v"
258
- style="height: 82vh"
259
- >
260
- <img
261
- :src="previewUrl"
262
- :alt="previewName"
263
- style="max-width: 98%; max-height: 98%"
264
- />
265
- </div>
266
- <div v-else class="p-a" style="height: 82vh">
267
- <component
268
- :is="previewSameOrg ? 'object' : 'div'"
269
- :key="previewUrl"
270
- :data="previewUrl"
271
- style="width: 100%; height: 100%"
272
- >
273
- <div class="flex-column flex-c flex-v" style="height: 100%">
274
- <i
275
- class="el-icon-s-release"
276
- style="font-size: 60px; color: #999"
277
- ></i>
278
- <span style="margin-top: 16px">
279
- 不支持在线预览,请
280
- <a :href="previewUrl" :download="previewName || previewUrl"
281
- >下载</a
282
- >
283
- 到本地查看
284
- </span>
285
- </div>
286
- </component>
287
- </div>
288
- </el-dialog>
289
- </div>
290
- </template>
291
-
292
- <script>
293
- import dayjs from 'dayjs'
294
- import axios from '../../utils/axios'
295
- import clUpload from '../Upload/index.vue'
296
- export default {
297
- name: 'FileUploadTable',
298
- components: {
299
- clUpload
300
- },
301
- filters: {
302
- typeFiter(type, typeOptions) {
303
- return typeOptions.find((c) => c.type === type)?.label || ''
304
- },
305
- acceptFilter(type, typeOptions, fileAccept) {
306
- return typeOptions.find((c) => c.type === type)?.accept || fileAccept
307
- },
308
- sizeFilter(type, typeOptions, fileSize) {
309
- return typeOptions.find((c) => c.type === type)?.size || fileSize
310
- }
311
- },
312
- props: {
313
- readonly: {
314
- type: Boolean,
315
- default: false
316
- },
317
- action: {
318
- type: String,
319
- default: '/bems/1.0/attach'
320
- },
321
- headers: {
322
- type: Object,
323
- default: undefined
324
- },
325
- seePrefix: {
326
- type: String,
327
- default: undefined
328
- },
329
- seeTypes: {
330
- type: RegExp,
331
- default: () => /\.jpg|\.png|\.gif|\.svg|\.pdf$/i
332
- },
333
- tableData: {
334
- type: Array,
335
- default: () => []
336
- },
337
- dataPorp: {
338
- type: Object,
339
- default: () => ({})
340
- }
341
- },
342
- data() {
343
- return {
344
- imgType: /\.jpg|\.png|\.gif|\.svg$/i,
345
- selectionList: [],
346
- fileAccept: this.dataPorp.fileAccept || undefined,
347
- fileSize: this.dataPorp.fileSize || undefined,
348
- typeOptions: this.dataPorp.typeOptions || [
349
- {
350
- type: '001',
351
- label: '信贷合同'
352
- },
353
- {
354
- type: '002',
355
- label: '贴现合同'
356
- },
357
- {
358
- type: '003',
359
- label: '其他合同'
360
- }
361
- ],
362
- keys: this.dataPorp.keys || {
363
- rowKey: 'id',
364
- type: 'type',
365
- name: 'name',
366
- url: 'url',
367
- time: 'time',
368
- user: 'user'
369
- },
370
-
371
- visibleP: false,
372
- previewUrl: undefined,
373
- previewName: undefined,
374
- previewSameOrg: false
375
- }
376
- },
377
- methods: {
378
- addRow() {
379
- this.$emit('add-row')
380
- },
381
- downRows() {
382
- this.$emit('down-rows', this.selectionList)
383
- },
384
- deleteRows() {
385
- this.$emit('delete-rows', this.selectionList)
386
- },
387
- async getFileInfo(row) {
388
- let _url = row[this.keys.url]
389
- this.seePrefix && (_url = this.seePrefix + _url)
390
- if (_url) {
391
- let blob = await axios.get(_url, {}, { responseType: 'blob' })
392
- let url = URL.createObjectURL(blob)
393
- let name = blob.name
394
- let sameOrg = this.seeTypes.test(name) || this.seeTypes.test(_url)
395
- return {
396
- url,
397
- name,
398
- sameOrg
399
- }
400
- } else {
401
- return {}
402
- }
403
- },
404
- async downFile(row) {
405
- let { url, name } = await this.getFileInfo(row)
406
- if (url) {
407
- let aDom = document.createElement('a')
408
- aDom.href = url
409
- aDom.download = name
410
- aDom.click()
411
-
412
- this.$nextTick(() => {
413
- aDom = undefined
414
- url && URL.revokeObjectURL(url)
415
- })
416
- }
417
- },
418
- async seeFile(row) {
419
- let { url, name, sameOrg } = await this.getFileInfo(row)
420
- if (url) {
421
- this.previewSameOrg = sameOrg
422
- this.previewUrl = url
423
- this.previewName = name
424
- this.visibleP = true
425
- }
426
- },
427
- closeSee() {
428
- this.previewUrl && URL.revokeObjectURL(this.previewUrl)
429
- },
430
- beforeUploadFn(file, row) {
431
- this.$set(row, '_percent', 0)
432
- this.$set(row, '_status', undefined)
433
-
434
- this.$emit('before-upload', file, row)
435
- },
436
- onProgressFn({ percent }, row) {
437
- this.$set(row, '_percent', percent <= 99 ? Math.round(percent) : 99)
438
- },
439
- onSuccessFn(response, file, fileList, row) {
440
- this.$set(row, '_name', file.name)
441
- this.$set(row, '_percent', 100)
442
-
443
- row[this.keys.time] = dayjs().format('YYYY-MM-DD HH:mm:ss')
444
-
445
- row[this.keys.url] = response.data
446
- if (!row[this.keys.name]) {
447
- row[this.keys.name] = file.name
448
- }
449
- this.$set(row, '_status', 'success')
450
-
451
- this.$emit('on-success', file, row)
452
- },
453
- errorFn(err, file, fileList, row, $index) {
454
- this.$set(row, '_status', 'exception')
455
-
456
- let clUpload = this.$refs['upload' + $index]
457
- /* 重置文件状态,并加入文件队列 */
458
- file.status = 'ready'
459
- clUpload.fileList = [file]
460
-
461
- this.$emit('on-error', file, row)
462
- },
463
- abortFn(row, $index) {
464
- this.$set(row, '_status', 'exception')
465
-
466
- let clUpload = this.$refs['upload' + $index]
467
- let elUpload = clUpload.$refs['upload']
468
- let uploadFiles = elUpload.uploadFiles
469
-
470
- /* 重置文件状态,并加入文件队列 */
471
- let file = uploadFiles[uploadFiles.length - 1]
472
- file.status = 'ready'
473
- clUpload.fileList = [file]
474
-
475
- elUpload.abort()
476
- },
477
- anewSubmitFn(row, $index) {
478
- this.$set(row, '_status', 'success')
479
-
480
- this.$refs['upload' + $index]?.$refs['upload']?.submit()
481
- }
482
- }
483
- }
484
- </script>
1
+ <template>
2
+ <div class="bd-t bd-l bd-r">
3
+ <!-- 查看附件信息 -->
4
+ <template v-if="readonly">
5
+ <div class="p-l p-r p-t-s p-b-s">
6
+ <div class="flex-box flex-v flex-lr">
7
+ <span><slot name="title">附件信息</slot></span>
8
+ <slot v-if="tableData.length" name="down-btn">
9
+ <el-button size="mini" plain @click="downRows">批量下载</el-button>
10
+ </slot>
11
+ </div>
12
+ </div>
13
+
14
+ <el-table
15
+ :data="tableData"
16
+ :row-key="keys.rowKey"
17
+ @selection-change="(selection) => (selectionList = selection)"
18
+ >
19
+ <slot name="selection-column"
20
+ ><el-table-column type="selection" width="50" align="center" />
21
+ </slot>
22
+ <el-table-column label="附件类型" :prop="keys.type">
23
+ <template slot="header" slot-scope="scope">
24
+ <slot name="type-header" :column="scope.column">附件类型</slot>
25
+ </template>
26
+ <template slot-scope="{ row }">
27
+ <slot name="type" :row="row">{{
28
+ row[keys.type] | typeFiter(typeOptions)
29
+ }}</slot>
30
+ </template>
31
+ </el-table-column>
32
+ <el-table-column label="附件名称" :prop="keys.name">
33
+ <template slot="header" slot-scope="scope">
34
+ <slot name="name-header" :column="scope.column">附件名称</slot>
35
+ </template>
36
+ <template slot-scope="{ row }">
37
+ <slot name="name" :row="row">{{ row[keys.name] }}</slot>
38
+ </template>
39
+ </el-table-column>
40
+ <el-table-column label="上传时间" :prop="keys.time" align="center">
41
+ <template slot="header" slot-scope="scope">
42
+ <slot name="time-header" :column="scope.column">上传时间</slot>
43
+ </template>
44
+ <template slot-scope="{ row }">
45
+ <slot name="time" :row="row">{{ row[keys.time] }}</slot>
46
+ </template>
47
+ </el-table-column>
48
+ <el-table-column label="上传人" :prop="keys.user">
49
+ <template slot="header" slot-scope="scope">
50
+ <slot name="user-header" :column="scope.column">上传人</slot>
51
+ </template>
52
+ <template slot-scope="{ row }">
53
+ <slot name="user" :row="row">{{ row[keys.user] }}</slot>
54
+ </template>
55
+ </el-table-column>
56
+ <el-table-column label="操作" align="center" width="80">
57
+ <template slot="header" slot-scope="scope">
58
+ <slot name="handle-header" :column="scope.column">操作</slot>
59
+ </template>
60
+ <template slot-scope="{ row }">
61
+ <slot name="handle" :row="row">
62
+ <el-button
63
+ type="text"
64
+ icon="el-icon-view"
65
+ @click="seeFile(row)"
66
+ />
67
+ <el-button
68
+ type="text"
69
+ icon="el-icon-download"
70
+ :disabled="!row[keys.url]"
71
+ @click="downFile(row)"
72
+ />
73
+ </slot>
74
+ </template>
75
+ </el-table-column>
76
+ </el-table>
77
+ </template>
78
+ <!-- 上传附件 -->
79
+ <template v-else>
80
+ <div class="p-l p-r p-t-s p-b-s">
81
+ <div class="flex-box flex-v flex-lr">
82
+ <span><slot name="title">附件信息</slot></span>
83
+ <div>
84
+ <slot name="add-btn">
85
+ <el-button type="primary" size="mini" @click="addRow"
86
+ >新增</el-button
87
+ >
88
+ </slot>
89
+ <slot v-if="tableData.length" name="down-btn">
90
+ <el-button size="mini" plain @click="downRows">下载</el-button>
91
+ </slot>
92
+ <slot v-if="tableData.length" name="delete-btn">
93
+ <el-button type="danger" plain size="mini" @click="deleteRows"
94
+ >删除</el-button
95
+ >
96
+ </slot>
97
+ </div>
98
+ </div>
99
+ </div>
100
+
101
+ <el-table
102
+ :data="tableData"
103
+ :row-key="keys.rowKey"
104
+ @selection-change="(selection) => (selectionList = selection)"
105
+ >
106
+ <slot name="selection-column"
107
+ ><el-table-column type="selection" width="50" align="center" />
108
+ </slot>
109
+ <el-table-column label="附件类型" min-width="160">
110
+ <template slot="header" slot-scope="scope">
111
+ <slot name="type-header" :column="scope.column">附件类型</slot>
112
+ </template>
113
+ <template slot-scope="{ row }">
114
+ <slot name="type" :row="row">
115
+ <el-select
116
+ v-model="row[keys.type]"
117
+ :disabled="row['_typeDisabled']"
118
+ placeholder="请选择附件类型"
119
+ style="width: 100%"
120
+ >
121
+ <el-option
122
+ v-for="item in typeOptions"
123
+ :key="item.type"
124
+ :disabled="item.disabled"
125
+ :value="item.type"
126
+ :label="item.label"
127
+ />
128
+ </el-select>
129
+ </slot>
130
+ </template>
131
+ </el-table-column>
132
+ <el-table-column label="附件名称" min-width="160">
133
+ <template slot="header" slot-scope="scope">
134
+ <slot name="name-header" :column="scope.column">附件名称</slot>
135
+ </template>
136
+ <template slot-scope="{ row }">
137
+ <slot name="name" :row="row">
138
+ <el-input v-model="row[keys.name]" />
139
+ </slot>
140
+ </template>
141
+ </el-table-column>
142
+ <el-table-column label="附件上传" min-width="160">
143
+ <template slot="header" slot-scope="scope">
144
+ <slot name="upload-header" :column="scope.column">附件上传</slot>
145
+ </template>
146
+ <template slot-scope="{ row, $index }">
147
+ <slot name="upload" :row="row" :$index="$index">
148
+ <clUpload
149
+ :ref="'upload' + $index"
150
+ class="n20-upload-table-up"
151
+ :file-name="row['_name'] || row[keys.name]"
152
+ :data="row['_fileData']"
153
+ :msg-type="null"
154
+ :show-clear="false"
155
+ :action="action"
156
+ :headers="headers"
157
+ :disabled="!row[keys.type]"
158
+ :accept="row[keys.type] | acceptFilter(typeOptions, fileAccept)"
159
+ :size="row[keys.type] | sizeFilter(typeOptions, fileSize)"
160
+ :before-upload="(file) => beforeUploadFn(file, row)"
161
+ :on-progress="(event) => onProgressFn(event, row)"
162
+ :on-success="
163
+ (response, file, fileList) =>
164
+ onSuccessFn(response, file, fileList, row)
165
+ "
166
+ :on-error="
167
+ (err, file, fileList) =>
168
+ errorFn(err, file, fileList, row, $index)
169
+ "
170
+ />
171
+ </slot>
172
+ </template>
173
+ </el-table-column>
174
+ <el-table-column
175
+ label="上传时间"
176
+ :prop="keys.time"
177
+ width="160"
178
+ align="center"
179
+ >
180
+ <template slot="header" slot-scope="scope">
181
+ <slot name="time-header" :column="scope.column">上传时间</slot>
182
+ </template>
183
+ <template slot-scope="{ row }">
184
+ <slot name="time" :row="row">{{ row[keys.time] }}</slot>
185
+ </template>
186
+ </el-table-column>
187
+ <el-table-column label="上传人" :prop="keys.user">
188
+ <template slot="header" slot-scope="scope">
189
+ <slot name="user-header" :column="scope.column">上传人</slot>
190
+ </template>
191
+ <template slot-scope="{ row }">
192
+ <slot name="user" :row="row">{{ row[keys.user] }}</slot>
193
+ </template>
194
+ </el-table-column>
195
+ <el-table-column label="上传进度" width="220">
196
+ <template slot="header" slot-scope="scope">
197
+ <slot name="percent-header" :column="scope.column">上传进度</slot>
198
+ </template>
199
+ <template slot-scope="{ row, $index }">
200
+ <slot name="percent" :row="row" :$index="$index">
201
+ <div v-if="row['_percent'] >= 0" class="flex-box flex-v">
202
+ <el-progress
203
+ class="n20-upload-table-progress"
204
+ :percentage="row['_percent']"
205
+ :status="row['_status']"
206
+ style="width: 140px"
207
+ />
208
+ <el-button
209
+ v-if="row['_status'] === 'exception'"
210
+ type="text"
211
+ size="mini"
212
+ style="width: 60px"
213
+ @click="anewSubmitFn(row, $index)"
214
+ >重新上传</el-button
215
+ >
216
+ <el-button
217
+ v-else-if="row['_percent'] >= 0 && row['_percent'] < 100"
218
+ type="text"
219
+ size="mini"
220
+ style="width: 60px"
221
+ @click="abortFn(row, $index)"
222
+ >取消</el-button
223
+ >
224
+ </div>
225
+ </slot>
226
+ </template>
227
+ </el-table-column>
228
+ <el-table-column label="操作" align="center" width="80">
229
+ <template slot="header" slot-scope="scope">
230
+ <slot name="handle-header" :column="scope.column">操作</slot>
231
+ </template>
232
+ <template slot-scope="{ row }">
233
+ <slot name="handle" :row="row">
234
+ <el-button
235
+ type="text"
236
+ icon="el-icon-view"
237
+ :disabled="!row[keys.url]"
238
+ @click="seeFile(row)"
239
+ />
240
+ </slot>
241
+ </template>
242
+ </el-table-column>
243
+ </el-table>
244
+ </template>
245
+
246
+ <el-dialog
247
+ class="p-a-0"
248
+ title="附件预览"
249
+ :visible.sync="visibleP"
250
+ top="2vh"
251
+ width="96%"
252
+ append-to-body
253
+ @close="closeSee"
254
+ >
255
+ <div
256
+ v-if="imgType.test(previewName)"
257
+ class="p-a flex-box flex-c flex-v"
258
+ style="height: 82vh"
259
+ >
260
+ <img
261
+ :src="previewUrl"
262
+ :alt="previewName"
263
+ style="max-width: 98%; max-height: 98%"
264
+ />
265
+ </div>
266
+ <div v-else class="p-a" style="height: 82vh">
267
+ <component
268
+ :is="previewSameOrg ? 'object' : 'div'"
269
+ :key="previewUrl"
270
+ :data="previewUrl"
271
+ style="width: 100%; height: 100%"
272
+ >
273
+ <div class="flex-column flex-c flex-v" style="height: 100%">
274
+ <i
275
+ class="el-icon-s-release"
276
+ style="font-size: 60px; color: #999"
277
+ ></i>
278
+ <span style="margin-top: 16px">
279
+ 不支持在线预览,请
280
+ <a :href="previewUrl" :download="previewName || previewUrl"
281
+ >下载</a
282
+ >
283
+ 到本地查看
284
+ </span>
285
+ </div>
286
+ </component>
287
+ </div>
288
+ </el-dialog>
289
+ </div>
290
+ </template>
291
+
292
+ <script>
293
+ import dayjs from 'dayjs'
294
+ import axios from '../../utils/axios'
295
+ import clUpload from '../Upload/index.vue'
296
+ export default {
297
+ name: 'FileUploadTable',
298
+ components: {
299
+ clUpload
300
+ },
301
+ filters: {
302
+ typeFiter(type, typeOptions) {
303
+ return typeOptions.find((c) => c.type === type)?.label || ''
304
+ },
305
+ acceptFilter(type, typeOptions, fileAccept) {
306
+ return typeOptions.find((c) => c.type === type)?.accept || fileAccept
307
+ },
308
+ sizeFilter(type, typeOptions, fileSize) {
309
+ return typeOptions.find((c) => c.type === type)?.size || fileSize
310
+ }
311
+ },
312
+ props: {
313
+ readonly: {
314
+ type: Boolean,
315
+ default: false
316
+ },
317
+ action: {
318
+ type: String,
319
+ default: '/bems/1.0/attach'
320
+ },
321
+ headers: {
322
+ type: Object,
323
+ default: undefined
324
+ },
325
+ seePrefix: {
326
+ type: String,
327
+ default: undefined
328
+ },
329
+ seeTypes: {
330
+ type: RegExp,
331
+ default: () => /\.jpg|\.png|\.gif|\.svg|\.pdf$/i
332
+ },
333
+ tableData: {
334
+ type: Array,
335
+ default: () => []
336
+ },
337
+ dataPorp: {
338
+ type: Object,
339
+ default: () => ({})
340
+ }
341
+ },
342
+ data() {
343
+ return {
344
+ imgType: /\.jpg|\.png|\.gif|\.svg$/i,
345
+ selectionList: [],
346
+ fileAccept: this.dataPorp.fileAccept || undefined,
347
+ fileSize: this.dataPorp.fileSize || undefined,
348
+ typeOptions: this.dataPorp.typeOptions || [
349
+ {
350
+ type: '001',
351
+ label: '信贷合同'
352
+ },
353
+ {
354
+ type: '002',
355
+ label: '贴现合同'
356
+ },
357
+ {
358
+ type: '003',
359
+ label: '其他合同'
360
+ }
361
+ ],
362
+ keys: this.dataPorp.keys || {
363
+ rowKey: 'id',
364
+ type: 'type',
365
+ name: 'name',
366
+ url: 'url',
367
+ time: 'time',
368
+ user: 'user'
369
+ },
370
+
371
+ visibleP: false,
372
+ previewUrl: undefined,
373
+ previewName: undefined,
374
+ previewSameOrg: false
375
+ }
376
+ },
377
+ methods: {
378
+ addRow() {
379
+ this.$emit('add-row')
380
+ },
381
+ downRows() {
382
+ this.$emit('down-rows', this.selectionList)
383
+ },
384
+ deleteRows() {
385
+ this.$emit('delete-rows', this.selectionList)
386
+ },
387
+ async getFileInfo(row) {
388
+ let _url = row[this.keys.url]
389
+ this.seePrefix && (_url = this.seePrefix + _url)
390
+ if (_url) {
391
+ let blob = await axios.get(_url, {}, { responseType: 'blob' })
392
+ let url = URL.createObjectURL(blob)
393
+ let name = blob.name
394
+ let sameOrg = this.seeTypes.test(name) || this.seeTypes.test(_url)
395
+ return {
396
+ url,
397
+ name,
398
+ sameOrg
399
+ }
400
+ } else {
401
+ return {}
402
+ }
403
+ },
404
+ async downFile(row) {
405
+ let { url, name } = await this.getFileInfo(row)
406
+ if (url) {
407
+ let aDom = document.createElement('a')
408
+ aDom.href = url
409
+ aDom.download = name
410
+ aDom.click()
411
+
412
+ this.$nextTick(() => {
413
+ aDom = undefined
414
+ url && URL.revokeObjectURL(url)
415
+ })
416
+ }
417
+ },
418
+ async seeFile(row) {
419
+ let { url, name, sameOrg } = await this.getFileInfo(row)
420
+ if (url) {
421
+ this.previewSameOrg = sameOrg
422
+ this.previewUrl = url
423
+ this.previewName = name
424
+ this.visibleP = true
425
+ }
426
+ },
427
+ closeSee() {
428
+ this.previewUrl && URL.revokeObjectURL(this.previewUrl)
429
+ },
430
+ beforeUploadFn(file, row) {
431
+ this.$set(row, '_percent', 0)
432
+ this.$set(row, '_status', undefined)
433
+
434
+ this.$emit('before-upload', file, row)
435
+ },
436
+ onProgressFn({ percent }, row) {
437
+ this.$set(row, '_percent', percent <= 99 ? Math.round(percent) : 99)
438
+ },
439
+ onSuccessFn(response, file, fileList, row) {
440
+ this.$set(row, '_name', file.name)
441
+ this.$set(row, '_percent', 100)
442
+
443
+ row[this.keys.time] = dayjs().format('YYYY-MM-DD HH:mm:ss')
444
+
445
+ row[this.keys.url] = response.data
446
+ if (!row[this.keys.name]) {
447
+ row[this.keys.name] = file.name
448
+ }
449
+ this.$set(row, '_status', 'success')
450
+
451
+ this.$emit('on-success', file, row)
452
+ },
453
+ errorFn(err, file, fileList, row, $index) {
454
+ this.$set(row, '_status', 'exception')
455
+
456
+ let clUpload = this.$refs['upload' + $index]
457
+ /* 重置文件状态,并加入文件队列 */
458
+ file.status = 'ready'
459
+ clUpload.fileList = [file]
460
+
461
+ this.$emit('on-error', file, row)
462
+ },
463
+ abortFn(row, $index) {
464
+ this.$set(row, '_status', 'exception')
465
+
466
+ let clUpload = this.$refs['upload' + $index]
467
+ let elUpload = clUpload.$refs['upload']
468
+ let uploadFiles = elUpload.uploadFiles
469
+
470
+ /* 重置文件状态,并加入文件队列 */
471
+ let file = uploadFiles[uploadFiles.length - 1]
472
+ file.status = 'ready'
473
+ clUpload.fileList = [file]
474
+
475
+ elUpload.abort()
476
+ },
477
+ anewSubmitFn(row, $index) {
478
+ this.$set(row, '_status', 'success')
479
+
480
+ this.$refs['upload' + $index]?.$refs['upload']?.submit()
481
+ }
482
+ }
483
+ }
484
+ </script>