n20-common-lib 1.2.33 → 1.2.36

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 +39 -39
  57. package/src/components/ApprovalRecord/index.vue +59 -59
  58. package/src/components/Button/button-group.vue +150 -150
  59. package/src/components/Button/icon-group-button.vue +61 -61
  60. package/src/components/Button/index.vue +56 -56
  61. package/src/components/CascaderArea/index.vue +103 -103
  62. package/src/components/ContentLoading/index.vue +41 -41
  63. package/src/components/ContentNull/index.vue +19 -19
  64. package/src/components/DatePicker/index.vue +27 -27
  65. package/src/components/DatePicker/por.vue +169 -169
  66. package/src/components/Dialog/index.vue +26 -26
  67. package/src/components/Dialog/indexO.vue +116 -116
  68. package/src/components/DragList/index.vue +75 -75
  69. package/src/components/Empty/.DS_Store +0 -0
  70. package/src/components/Empty/img/.DS_Store +0 -0
  71. package/src/components/Empty/img/abnormal.svg +108 -108
  72. package/src/components/Empty/img/dispose.svg +71 -71
  73. package/src/components/Empty/img/empty.svg +57 -57
  74. package/src/components/Empty/img/general.svg +58 -58
  75. package/src/components/Empty/img/lock.svg +57 -57
  76. package/src/components/Empty/img/network.svg +59 -59
  77. package/src/components/Empty/img/relevant.svg +68 -68
  78. package/src/components/Empty/img/search.svg +72 -72
  79. package/src/components/Empty/index.vue +92 -92
  80. package/src/components/Expandable/index.vue +49 -49
  81. package/src/components/Expandable/main.vue +52 -52
  82. package/src/components/FileExportAsync/index.vue +178 -178
  83. package/src/components/FileUploadTable/index.vue +484 -484
  84. package/src/components/Filters/index.vue +371 -371
  85. package/src/components/Filters/indexO.vue +104 -104
  86. package/src/components/FlowStep/index.vue +68 -68
  87. package/src/components/FooterBox/index.vue +21 -21
  88. package/src/components/GeneralCard/index.vue +15 -15
  89. package/src/components/InputNumber/index.vue +169 -169
  90. package/src/components/InputNumber/numberRange.vue +47 -47
  91. package/src/components/InputSearch/index.vue +75 -75
  92. package/src/components/Layout/.DS_Store +0 -0
  93. package/src/components/Layout/AsideNav/index.vue +119 -119
  94. package/src/components/Layout/AsideNav/menuItem.vue +34 -34
  95. package/src/components/Layout/AsideNav/submenuTitle.vue +26 -26
  96. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -215
  97. package/src/components/Layout/HeaderWrap/index.vue +371 -371
  98. package/src/components/Layout/HeaderWrap/noticePop.vue +300 -300
  99. package/src/components/Layout/SubContent/index.vue +127 -131
  100. package/src/components/Layout/TabsNav/index.vue +170 -170
  101. package/src/components/Layout/index.vue +518 -522
  102. package/src/components/Layout/utils.js +12 -12
  103. package/src/components/LoginTemporary/form.vue +570 -570
  104. package/src/components/LoginTemporary/index.vue +139 -139
  105. package/src/components/LoginTemporary/qrcode.vue +90 -90
  106. package/src/components/LoginTemporary/retrievePw.vue +372 -372
  107. package/src/components/LoginTemporary/utils.js +73 -73
  108. package/src/components/MicroApp/index.js +67 -67
  109. package/src/components/MicroFrame/index.vue +95 -95
  110. package/src/components/MoreTab/index.vue +232 -232
  111. package/src/components/NavMenu/index.vue +60 -60
  112. package/src/components/NstcG6Components/.DS_Store +0 -0
  113. package/src/components/NstcG6Components/NstcDialog/NstcDialog.vue +184 -184
  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 +229 -229
  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 +66 -66
  186. package/src/utils/urlToGo.js +82 -82
  187. package/style/css/normalize.scss +726 -726
  188. package/style/index.css +3 -3
  189. package/style/pageDemo/demo-1.vue +131 -131
  190. package/style/pageDemo/demo-2.vue +35 -35
  191. package/style/pageDemo/demo-3.vue +22 -22
  192. package/style/pageDemo/seeCode.js +20 -20
  193. package/style/server-config.jsonc +717 -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>