n20-common-lib 1.2.29 → 1.2.32

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 (191) 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/Anchor/AnchorItem.vue +29 -29
  52. package/src/components/Anchor/index.vue +185 -185
  53. package/src/components/ApprovalButtons/index.vue +233 -233
  54. package/src/components/ApprovalCard/index.vue +128 -128
  55. package/src/components/ApprovalRecord/approvalImg.vue +39 -39
  56. package/src/components/ApprovalRecord/index.vue +59 -59
  57. package/src/components/Button/button-group.vue +150 -150
  58. package/src/components/Button/icon-group-button.vue +61 -61
  59. package/src/components/Button/index.vue +56 -56
  60. package/src/components/CascaderArea/index.vue +103 -103
  61. package/src/components/ContentLoading/index.vue +41 -41
  62. package/src/components/ContentNull/index.vue +19 -19
  63. package/src/components/DatePicker/index.vue +27 -27
  64. package/src/components/DatePicker/por.vue +169 -169
  65. package/src/components/Dialog/index.vue +26 -26
  66. package/src/components/Dialog/indexO.vue +116 -116
  67. package/src/components/DragList/index.vue +75 -75
  68. package/src/components/Empty/img/abnormal.svg +108 -108
  69. package/src/components/Empty/img/dispose.svg +71 -71
  70. package/src/components/Empty/img/empty.svg +57 -57
  71. package/src/components/Empty/img/general.svg +58 -58
  72. package/src/components/Empty/img/lock.svg +57 -57
  73. package/src/components/Empty/img/network.svg +59 -59
  74. package/src/components/Empty/img/relevant.svg +68 -68
  75. package/src/components/Empty/img/search.svg +72 -72
  76. package/src/components/Empty/index.vue +92 -92
  77. package/src/components/Expandable/index.vue +49 -49
  78. package/src/components/Expandable/main.vue +52 -52
  79. package/src/components/FileExportAsync/index.vue +178 -178
  80. package/src/components/FileUploadTable/index.vue +484 -484
  81. package/src/components/Filters/index.vue +371 -371
  82. package/src/components/Filters/indexO.vue +104 -104
  83. package/src/components/FlowStep/index.vue +68 -68
  84. package/src/components/FooterBox/index.vue +21 -21
  85. package/src/components/GeneralCard/index.vue +15 -15
  86. package/src/components/InputNumber/index.vue +169 -169
  87. package/src/components/InputNumber/numberRange.vue +47 -47
  88. package/src/components/InputSearch/index.vue +75 -75
  89. package/src/components/Layout/AsideNav/index.vue +119 -119
  90. package/src/components/Layout/AsideNav/menuItem.vue +34 -34
  91. package/src/components/Layout/AsideNav/submenuTitle.vue +26 -26
  92. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -215
  93. package/src/components/Layout/HeaderWrap/index.vue +371 -373
  94. package/src/components/Layout/HeaderWrap/noticePop.vue +300 -300
  95. package/src/components/Layout/SubContent/index.vue +131 -131
  96. package/src/components/Layout/TabsNav/index.vue +170 -170
  97. package/src/components/Layout/index.vue +522 -529
  98. package/src/components/Layout/utils.js +12 -12
  99. package/src/components/LoginTemporary/form.vue +561 -564
  100. package/src/components/LoginTemporary/index.vue +139 -146
  101. package/src/components/LoginTemporary/qrcode.vue +90 -90
  102. package/src/components/LoginTemporary/retrievePw.vue +372 -374
  103. package/src/components/LoginTemporary/utils.js +73 -73
  104. package/src/components/MicroApp/index.js +67 -67
  105. package/src/components/MicroFrame/index.vue +95 -95
  106. package/src/components/MoreTab/index.vue +232 -232
  107. package/src/components/NavMenu/index.vue +60 -60
  108. package/src/components/NstcG6Components/NstcDialog/NstcDialog.vue +184 -184
  109. package/src/components/PageLayout/page.vue +15 -15
  110. package/src/components/Pagination/index.vue +165 -165
  111. package/src/components/SecondaryTab/index.vue +58 -58
  112. package/src/components/SelectLazy/index.vue +75 -75
  113. package/src/components/SelectTree/SelectTreeLazy.vue +241 -241
  114. package/src/components/SelectTree/index.vue +205 -205
  115. package/src/components/ShowColumn/index.vue +213 -208
  116. package/src/components/Sifting/index.vue +99 -99
  117. package/src/components/Statis/index.vue +97 -97
  118. package/src/components/Statis/statisItem.vue +54 -54
  119. package/src/components/Statis/statisPopover.vue +55 -55
  120. package/src/components/Step/index.vue +38 -38
  121. package/src/components/Suspend/index.vue +72 -72
  122. package/src/components/Table/index.vue +209 -209
  123. package/src/components/Table/indexO.vue +149 -149
  124. package/src/components/Task/index.vue +26 -26
  125. package/src/components/TertiaryTab/index.vue +63 -63
  126. package/src/components/TimePicker/index.vue +28 -28
  127. package/src/components/Upload/index.vue +242 -242
  128. package/src/components/WornPagination/index.vue +73 -73
  129. package/src/directives/VClickOutside/index.js +19 -19
  130. package/src/directives/VHas/index.js +58 -58
  131. package/src/directives/VMove/index.js +42 -42
  132. package/src/directives/VTitle/index.js +69 -69
  133. package/src/directives/VTitle/tooltip.vue +21 -21
  134. package/src/index.js +229 -229
  135. package/src/plugins/CompatibleOld/index.js +57 -57
  136. package/src/plugins/Print/index.js +4 -4
  137. package/src/plugins/Print/print-js/.babelrc +12 -12
  138. package/src/plugins/Print/print-js/LICENSE +21 -21
  139. package/src/plugins/Print/print-js/README.md +98 -98
  140. package/src/plugins/Print/print-js/dist/print.css +96 -96
  141. package/src/plugins/Print/print-js/dist/print.js +990 -990
  142. package/src/plugins/Print/print-js/package.json +60 -60
  143. package/src/plugins/Print/print-js/src/index.d.ts +45 -45
  144. package/src/plugins/Print/print-js/src/index.js +10 -10
  145. package/src/plugins/Print/print-js/src/js/browser.js +33 -33
  146. package/src/plugins/Print/print-js/src/js/functions.js +103 -103
  147. package/src/plugins/Print/print-js/src/js/html.js +70 -70
  148. package/src/plugins/Print/print-js/src/js/image.js +48 -48
  149. package/src/plugins/Print/print-js/src/js/init.js +168 -168
  150. package/src/plugins/Print/print-js/src/js/json.js +109 -109
  151. package/src/plugins/Print/print-js/src/js/modal.js +62 -62
  152. package/src/plugins/Print/print-js/src/js/pdf.js +62 -62
  153. package/src/plugins/Print/print-js/src/js/print.js +102 -102
  154. package/src/plugins/Print/print-js/src/js/raw-html.js +15 -15
  155. package/src/plugins/Print/print-js/src/sass/index.scss +13 -13
  156. package/src/plugins/Print/print-js/src/sass/modules/_colors.scss +9 -9
  157. package/src/plugins/Print/print-js/src/sass/partials/_modal.scss +40 -40
  158. package/src/plugins/Print/print-js/src/sass/partials/_spinner.scss +45 -45
  159. package/src/plugins/Print/print.js +2 -2
  160. package/src/plugins/Print/print.scss +1 -1
  161. package/src/plugins/SetMenuTree/index.vue +41 -41
  162. package/src/plugins/SetMenuTree/logoIcon.vue +37 -37
  163. package/src/plugins/SetMenuTree/setmenutree.vue +427 -427
  164. package/src/plugins/SetMenuTree/utils.js +74 -74
  165. package/src/plugins/Sign/InfosecNetSignCNGAgent.min.js +2000 -2000
  166. package/src/plugins/Sign/index.js +65 -65
  167. package/src/plugins/Sign/sign.js +1 -1
  168. package/src/plugins/setTabsForSub.js +2 -2
  169. package/src/utils/auth.js +53 -53
  170. package/src/utils/axios.js +203 -203
  171. package/src/utils/downloadBlob.js +19 -19
  172. package/src/utils/forEachs.js +16 -16
  173. package/src/utils/getScrollContainer.js +43 -43
  174. package/src/utils/i18n/cn2hk.json +1270 -1270
  175. package/src/utils/i18n/index.js +50 -50
  176. package/src/utils/list2tree.js +36 -36
  177. package/src/utils/msgboxPor.js +26 -26
  178. package/src/utils/print.js +161 -161
  179. package/src/utils/relaNo.js +76 -76
  180. package/src/utils/repairElementUI.js +66 -66
  181. package/src/utils/urlToGo.js +82 -82
  182. package/style/css/normalize.scss +726 -726
  183. package/style/index.css +3 -3
  184. package/style/pageDemo/demo-1.vue +131 -131
  185. package/style/pageDemo/demo-2.vue +35 -35
  186. package/style/pageDemo/demo-3.vue +22 -22
  187. package/style/pageDemo/seeCode.js +20 -20
  188. package/style/server-config.jsonc +606 -606
  189. package/src/components/.DS_Store +0 -0
  190. package/src/components/Layout/.DS_Store +0 -0
  191. package/src/components/NstcG6Components/.DS_Store +0 -0
@@ -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>