n20-common-lib 1.2.39 → 1.2.42

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