n20-common-lib 2.1.3 → 2.1.4
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.
- package/package.json +1 -1
- package/src/assets/css/normalize.scss +15 -35
- package/src/components/DatePicker/por.vue +1 -1
- package/src/components/FileUploadTable/index.vue +169 -258
- package/src/components/Filters/index.vue +6 -1
- package/src/components/Filters/indexO.vue +6 -1
- package/src/components/InputNumber/index.vue +2 -4
- package/src/components/Layout/index.vue +3 -1
- package/src/components/LoginSetting/index.vue +1 -1
- package/src/components/LoginSetting/setItem.vue +35 -12
- package/src/components/LoginTemporary/indexN.vue +3 -2
- package/src/components/Table/index.vue +7 -3
- package/src/components/Upload/index.vue +9 -2
- package/src/utils/urlToGo.js +34 -7
package/package.json
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
$--font-size-base: 14px !default;
|
|
2
|
-
$--border-color-base: #dcdfe6 !default;
|
|
3
|
-
$--border-radius-base: 4px !default;
|
|
4
|
-
$--input-width: 224px !default;
|
|
5
|
-
|
|
6
1
|
// 项目中可以直接使用
|
|
7
2
|
// .input-w {width: $--input-width;}
|
|
8
3
|
// .button-4em{min-width: 72px;}
|
|
9
|
-
/* 格式化样式
|
|
10
|
-
---------------- */
|
|
4
|
+
/* 格式化样式 */
|
|
11
5
|
html {
|
|
12
6
|
height: 100%;
|
|
13
7
|
}
|
|
@@ -31,8 +25,7 @@ iframe {
|
|
|
31
25
|
outline: none;
|
|
32
26
|
}
|
|
33
27
|
|
|
34
|
-
/* 滚动条样式
|
|
35
|
-
--------------- */
|
|
28
|
+
/* 滚动条样式 */
|
|
36
29
|
::-webkit-scrollbar {
|
|
37
30
|
width: 6px;
|
|
38
31
|
height: 6px;
|
|
@@ -81,8 +74,7 @@ iframe {
|
|
|
81
74
|
--client-height: calc(100vh - 116px);
|
|
82
75
|
}
|
|
83
76
|
|
|
84
|
-
/* 内外边距
|
|
85
|
-
--------------- */
|
|
77
|
+
/* 内外边距 */
|
|
86
78
|
@mixin set-pm($m, $p) {
|
|
87
79
|
.p-a#{$m} {
|
|
88
80
|
padding: $p;
|
|
@@ -148,8 +140,7 @@ iframe {
|
|
|
148
140
|
@include set-pm('-ss', 4px !important);
|
|
149
141
|
@include set-pm('-0', 0 !important);
|
|
150
142
|
|
|
151
|
-
/* 内外边距
|
|
152
|
-
--------------- */
|
|
143
|
+
/* 内外边距 */
|
|
153
144
|
@mixin pm-fn($n) {
|
|
154
145
|
.pa-#{$n} {
|
|
155
146
|
padding: #{$n}px;
|
|
@@ -221,8 +212,7 @@ iframe {
|
|
|
221
212
|
@include pm-fn(12);
|
|
222
213
|
@include pm-fn(14);
|
|
223
214
|
|
|
224
|
-
/* 浮动布局
|
|
225
|
-
--------------- */
|
|
215
|
+
/* 浮动布局 */
|
|
226
216
|
.left,
|
|
227
217
|
.float-left {
|
|
228
218
|
float: left;
|
|
@@ -265,8 +255,7 @@ iframe {
|
|
|
265
255
|
clear: right;
|
|
266
256
|
}
|
|
267
257
|
|
|
268
|
-
/* 行内块元素水平垂直对齐方式
|
|
269
|
-
--------------- */
|
|
258
|
+
/* 行内块元素水平垂直对齐方式 */
|
|
270
259
|
.b-center {
|
|
271
260
|
text-align: center;
|
|
272
261
|
|
|
@@ -294,8 +283,7 @@ iframe {
|
|
|
294
283
|
}
|
|
295
284
|
}
|
|
296
285
|
|
|
297
|
-
/* 文字居中
|
|
298
|
-
--------------- */
|
|
286
|
+
/* 文字居中 */
|
|
299
287
|
.text {
|
|
300
288
|
&-c {
|
|
301
289
|
text-align: center !important;
|
|
@@ -321,8 +309,7 @@ iframe {
|
|
|
321
309
|
}
|
|
322
310
|
}
|
|
323
311
|
|
|
324
|
-
/* 弹性盒模型
|
|
325
|
-
--------------- */
|
|
312
|
+
/* 弹性盒模型 */
|
|
326
313
|
.flex-box {
|
|
327
314
|
display: flex;
|
|
328
315
|
}
|
|
@@ -573,34 +560,29 @@ iframe {
|
|
|
573
560
|
color: #333;
|
|
574
561
|
}
|
|
575
562
|
|
|
576
|
-
/* 鼠标默认样式
|
|
577
|
-
--------------- */
|
|
563
|
+
/* 鼠标默认样式 */
|
|
578
564
|
.cursor-d {
|
|
579
565
|
cursor: default;
|
|
580
566
|
}
|
|
581
567
|
|
|
582
|
-
/* 鼠标小手
|
|
583
|
-
--------------- */
|
|
568
|
+
/* 鼠标小手 */
|
|
584
569
|
.pointer {
|
|
585
570
|
cursor: pointer;
|
|
586
571
|
}
|
|
587
572
|
|
|
588
|
-
/*
|
|
589
|
-
---------------- */
|
|
573
|
+
/* 鼠标禁止- */
|
|
590
574
|
.cursor-not {
|
|
591
575
|
cursor: not-allowed;
|
|
592
576
|
}
|
|
593
577
|
|
|
594
|
-
/* 字重
|
|
595
|
-
--------------- */
|
|
578
|
+
/* 字重 */
|
|
596
579
|
.font {
|
|
597
580
|
&-w600 {
|
|
598
581
|
font-weight: var(--font-weight-bold);
|
|
599
582
|
}
|
|
600
583
|
}
|
|
601
584
|
|
|
602
|
-
/* 字号
|
|
603
|
-
--------------- */
|
|
585
|
+
/* 字号 */
|
|
604
586
|
.f-s {
|
|
605
587
|
&-s {
|
|
606
588
|
/* 12号字 */
|
|
@@ -627,8 +609,7 @@ iframe {
|
|
|
627
609
|
}
|
|
628
610
|
}
|
|
629
611
|
|
|
630
|
-
/* 宽高范围是 60-1000
|
|
631
|
-
---------------- */
|
|
612
|
+
/* 宽高范围是 60-1000- */
|
|
632
613
|
$list: 45, 60, 80, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290,
|
|
633
614
|
300, 400, 500, 600, 700, 800, 900, 1000;
|
|
634
615
|
|
|
@@ -690,8 +671,7 @@ $list: 45, 60, 80, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 2
|
|
|
690
671
|
}
|
|
691
672
|
}
|
|
692
673
|
|
|
693
|
-
/* 垂直对齐
|
|
694
|
-
--------------- */
|
|
674
|
+
/* 垂直对齐 */
|
|
695
675
|
.align {
|
|
696
676
|
&-baseline {
|
|
697
677
|
vertical-align: baseline; // 将一个元素的基线与其父元素的基线对齐。
|
|
@@ -166,7 +166,7 @@ export default {
|
|
|
166
166
|
this.pickerOptions
|
|
167
167
|
)
|
|
168
168
|
|
|
169
|
-
this.listeners = Object.assign({}, this.$listeners, { input: () => {} })
|
|
169
|
+
this.listeners = Object.assign({}, this.$listeners, { input: () => {}, change: () => {} })
|
|
170
170
|
return {}
|
|
171
171
|
},
|
|
172
172
|
computed: {
|
|
@@ -1,253 +1,161 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="file-upload-table">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<div
|
|
6
|
-
<
|
|
7
|
-
<
|
|
8
|
-
<slot v-if="tableData.length" name="down-btn">
|
|
9
|
-
<el-button size="mini" plain @click="downRows">{{ '批量下载' | $lc }}</el-button>
|
|
10
|
-
</slot>
|
|
11
|
-
</div>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<el-table :data="tableData" :row-key="keys.rowKey" @selection-change="(selection) => (selectionList = selection)">
|
|
15
|
-
<slot name="selection-column">
|
|
16
|
-
<el-table-column type="selection" width="50" align="center" />
|
|
3
|
+
<div class="flex-box flex-v flex-lr m-b-s">
|
|
4
|
+
<div><slot name="title"></slot></div>
|
|
5
|
+
<div>
|
|
6
|
+
<slot v-if="!readonly" name="add-btn">
|
|
7
|
+
<el-button type="primary" size="mini" @click="addRow">{{ '新增' | $lc }}</el-button>
|
|
17
8
|
</slot>
|
|
18
|
-
<
|
|
19
|
-
<el-
|
|
20
|
-
v-for="item in dataPorp.slotHeader"
|
|
21
|
-
:key="item.prop"
|
|
22
|
-
:label="item.label"
|
|
23
|
-
:prop="item.prop"
|
|
24
|
-
:align="item.align || 'center'"
|
|
25
|
-
:width="item.width || 'auto'"
|
|
26
|
-
:show-overflow-tooltip="item['show-overflow-tooltip']"
|
|
27
|
-
/>
|
|
28
|
-
</template>
|
|
29
|
-
<template v-else>
|
|
30
|
-
<el-table-column :label="'附件类型' | $lc" :prop="keys.type">
|
|
31
|
-
<template slot="header" slot-scope="scope">
|
|
32
|
-
<slot name="type-header" :column="scope.column">{{ '附件类型' | $lc }}</slot>
|
|
33
|
-
</template>
|
|
34
|
-
<template slot-scope="{ row }">
|
|
35
|
-
<slot name="type" :row="row">{{ row[keys.type] | typeFiter(typeOptions) }}</slot>
|
|
36
|
-
</template>
|
|
37
|
-
</el-table-column>
|
|
38
|
-
<el-table-column :label="'附件名称' | $lc" :prop="keys.name">
|
|
39
|
-
<template slot="header" slot-scope="scope">
|
|
40
|
-
<slot name="name-header" :column="scope.column">{{ '附件名称' | $lc }}</slot>
|
|
41
|
-
</template>
|
|
42
|
-
<template slot-scope="{ row }">
|
|
43
|
-
<slot name="name" :row="row">{{ row[keys.name] ? row[keys.name].replace(/\.[A-z0-9]+$/, '') : '' }}</slot>
|
|
44
|
-
</template>
|
|
45
|
-
</el-table-column>
|
|
46
|
-
<el-table-column :label="'附件上传' | $lc" :prop="keys.name">
|
|
47
|
-
<template slot="header" slot-scope="scope">
|
|
48
|
-
<slot name="name-header" :column="scope.column">{{ '附件上传' | $lc }}</slot>
|
|
49
|
-
</template>
|
|
50
|
-
<template slot-scope="{ row }">
|
|
51
|
-
<slot name="name" :row="row">{{ $options.filters.fileName(row, keys.url) || row[keys.name] }}</slot>
|
|
52
|
-
</template>
|
|
53
|
-
</el-table-column>
|
|
54
|
-
<template slot-scope="{ row }">
|
|
55
|
-
<slot name="slotCol" :row="row"></slot>
|
|
56
|
-
</template>
|
|
57
|
-
<el-table-column :label="'上传时间' | $lc" :prop="keys.time" width="170" align="left">
|
|
58
|
-
<template slot="header" slot-scope="scope">
|
|
59
|
-
<slot name="time-header" :column="scope.column">{{ '上传时间' | $lc }}</slot>
|
|
60
|
-
</template>
|
|
61
|
-
<template slot-scope="{ row }">
|
|
62
|
-
<slot name="time" :row="row">{{ row[keys.time] }}</slot>
|
|
63
|
-
</template>
|
|
64
|
-
</el-table-column>
|
|
65
|
-
<el-table-column :label="'上传人' | $lc" :prop="keys.user">
|
|
66
|
-
<template slot="header" slot-scope="scope">
|
|
67
|
-
<slot name="user-header" :column="scope.column">{{ '上传人' | $lc }}</slot>
|
|
68
|
-
</template>
|
|
69
|
-
<template slot-scope="{ row }">
|
|
70
|
-
<slot name="user" :row="row">{{ row[keys.user] }}</slot>
|
|
71
|
-
</template>
|
|
72
|
-
</el-table-column>
|
|
73
|
-
</template>
|
|
74
|
-
<el-table-column :label="'操作' | $lc" align="center" width="80" fixed="right">
|
|
75
|
-
<template slot="header" slot-scope="scope">
|
|
76
|
-
<slot name="handle-header" :column="scope.column">{{ '操作' | $lc }}</slot>
|
|
77
|
-
</template>
|
|
78
|
-
<template slot-scope="{ row }">
|
|
79
|
-
<slot name="handle" :row="row">
|
|
80
|
-
<el-button type="text" icon="el-icon-view" @click="seeFile(row)" />
|
|
81
|
-
<el-button type="text" icon="el-icon-download" :disabled="!row[keys.url]" @click="downFile(row)" />
|
|
82
|
-
</slot>
|
|
83
|
-
</template>
|
|
84
|
-
</el-table-column>
|
|
85
|
-
</el-table>
|
|
86
|
-
</template>
|
|
87
|
-
<!-- 上传附件 -->
|
|
88
|
-
<template v-else>
|
|
89
|
-
<div class="p-b-s">
|
|
90
|
-
<div class="flex-box flex-v flex-lr">
|
|
91
|
-
<div><slot name="title"></slot></div>
|
|
92
|
-
<div>
|
|
93
|
-
<slot name="add-btn">
|
|
94
|
-
<el-button type="primary" size="mini" @click="addRow">{{ '新增' | $lc }}</el-button>
|
|
95
|
-
</slot>
|
|
96
|
-
<slot v-if="showBatchUpload" name="batch-btn">
|
|
97
|
-
<el-button size="mini" plain @click="visibleBatch = true">{{ '批量上传' | $lc }}</el-button>
|
|
98
|
-
</slot>
|
|
99
|
-
<slot v-if="tableData.length" name="down-btn">
|
|
100
|
-
<el-button size="mini" plain @click="downRows">{{ '下载' | $lc }}</el-button>
|
|
101
|
-
</slot>
|
|
102
|
-
<slot v-if="tableData.length" name="delete-btn">
|
|
103
|
-
<el-button type="danger" plain size="mini" @click="deleteRows">{{ '删除' | $lc }}</el-button>
|
|
104
|
-
</slot>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
<el-table :data="tableData" :row-key="keys.rowKey" @selection-change="(selection) => (selectionList = selection)">
|
|
109
|
-
<slot name="selection-column">
|
|
110
|
-
<el-table-column type="selection" width="50" align="center" />
|
|
9
|
+
<slot v-if="!readonly && showBatchUpload" name="batch-btn">
|
|
10
|
+
<el-button size="mini" plain @click="visibleBatch = true">{{ '批量上传' | $lc }}</el-button>
|
|
111
11
|
</slot>
|
|
112
|
-
<
|
|
113
|
-
<el-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<slot name="user-header" :column="scope.column">{{ '上传人' | $lc }}</slot>
|
|
200
|
-
</template>
|
|
201
|
-
<template slot-scope="{ row }">
|
|
202
|
-
<slot name="user" :row="row">{{ row[keys.user] }}</slot>
|
|
203
|
-
</template>
|
|
204
|
-
</el-table-column>
|
|
205
|
-
</template>
|
|
206
|
-
<el-table-column :label="'上传进度' | $lc" width="220">
|
|
207
|
-
<template slot="header" slot-scope="scope">
|
|
208
|
-
<slot name="percent-header" :column="scope.column">{{ '上传进度' | $lc }}</slot>
|
|
209
|
-
</template>
|
|
210
|
-
<template slot-scope="{ row, $index }">
|
|
211
|
-
<slot name="percent" :row="row" :$index="$index">
|
|
212
|
-
<div v-if="row['_percent'] >= 0 || !row['_typeDisabled']" class="flex-box flex-v">
|
|
213
|
-
<el-progress
|
|
214
|
-
class="n20-upload-table-progress"
|
|
215
|
-
:percentage="row['_percent']"
|
|
216
|
-
:status="row['_status']"
|
|
217
|
-
style="width: 140px"
|
|
218
|
-
/>
|
|
219
|
-
<el-button
|
|
220
|
-
v-if="row['_status'] === 'exception' || !row['_typeDisabled']"
|
|
221
|
-
type="text"
|
|
222
|
-
size="mini"
|
|
223
|
-
style="width: 60px"
|
|
224
|
-
@click="anewSubmitFn(row, $index)"
|
|
225
|
-
>{{ '重新上传' | $lc }}</el-button
|
|
226
|
-
>
|
|
227
|
-
<el-button
|
|
228
|
-
v-else-if="(row['_percent'] >= 0 && row['_percent'] < 100) || !row['_typeDisabled']"
|
|
229
|
-
type="text"
|
|
230
|
-
size="mini"
|
|
231
|
-
style="width: 60px"
|
|
232
|
-
@click="abortFn(row, $index)"
|
|
233
|
-
>{{ '取消' | $lc }}</el-button
|
|
234
|
-
>
|
|
235
|
-
</div>
|
|
236
|
-
</slot>
|
|
237
|
-
</template>
|
|
12
|
+
<slot name="down-btn">
|
|
13
|
+
<el-button size="mini" plain @click="downRows">{{ '下载' | $lc }}</el-button>
|
|
14
|
+
</slot>
|
|
15
|
+
<slot v-if="!readonly" name="delete-btn">
|
|
16
|
+
<el-button type="danger" plain size="mini" @click="deleteRows">{{ '删除' | $lc }}</el-button>
|
|
17
|
+
</slot>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<el-table :data="tableData" :row-key="keys.rowKey" @selection-change="(selection) => (selectionList = selection)">
|
|
21
|
+
<slot name="selection-column">
|
|
22
|
+
<el-table-column type="selection" width="50" align="center" />
|
|
23
|
+
</slot>
|
|
24
|
+
<template v-if="dataPorp.slotHeader">
|
|
25
|
+
<el-table-column
|
|
26
|
+
v-for="item in dataPorp.slotHeader"
|
|
27
|
+
:key="item.prop"
|
|
28
|
+
:label="item.label"
|
|
29
|
+
:prop="item.prop"
|
|
30
|
+
:align="item.align || 'center'"
|
|
31
|
+
:width="item.width || 'auto'"
|
|
32
|
+
:show-overflow-tooltip="item.showOverflowTooltip || item['show-overflow-tooltip']"
|
|
33
|
+
/>
|
|
34
|
+
</template>
|
|
35
|
+
<template v-else>
|
|
36
|
+
<el-table-column :label="'附件类型' | $lc" :prop="keys.type">
|
|
37
|
+
<slot slot="header" slot-scope="scope" name="type-header" :column="scope.column">{{ '附件类型' | $lc }}</slot>
|
|
38
|
+
<slot slot-scope="{ row }" name="type" :row="row">
|
|
39
|
+
<span v-if="readonly">{{ row[keys.type] | typeFiter(typeOptions) }}</span>
|
|
40
|
+
<el-select
|
|
41
|
+
v-else
|
|
42
|
+
v-model="row[keys.type]"
|
|
43
|
+
:disabled="row._typeDisabled"
|
|
44
|
+
:placeholder="'请选择' | $lc"
|
|
45
|
+
style="width: 100%"
|
|
46
|
+
>
|
|
47
|
+
<el-option
|
|
48
|
+
v-for="item in typeOptions"
|
|
49
|
+
:key="item.type"
|
|
50
|
+
:disabled="item.disabled"
|
|
51
|
+
:value="item.type"
|
|
52
|
+
:label="item.label"
|
|
53
|
+
/>
|
|
54
|
+
</el-select>
|
|
55
|
+
</slot>
|
|
56
|
+
</el-table-column>
|
|
57
|
+
<el-table-column :label="'附件名称' | $lc" :prop="keys.name">
|
|
58
|
+
<slot slot="header" slot-scope="scope" name="name-header" :column="scope.column">{{ '附件名称' | $lc }}</slot>
|
|
59
|
+
<slot slot-scope="{ row }" name="name" :row="row">
|
|
60
|
+
<span v-if="readonly">{{ row[keys.name] ? row[keys.name].replace(/\.[A-z0-9]+$/, '') : '' }}</span>
|
|
61
|
+
<el-input
|
|
62
|
+
v-else
|
|
63
|
+
:value="row[keys.name] ? row[keys.name].replace(/\.[A-z0-9]+$/, '') : ''"
|
|
64
|
+
disabled
|
|
65
|
+
:placeholder="'请输入' | $lc"
|
|
66
|
+
/>
|
|
67
|
+
</slot>
|
|
68
|
+
</el-table-column>
|
|
69
|
+
<el-table-column v-if="readonly" :label="'附件上传' | $lc" :prop="keys.name">
|
|
70
|
+
<slot slot="header" slot-scope="scope" name="name-header" :column="scope.column">{{ '附件上传' | $lc }}</slot>
|
|
71
|
+
<slot slot-scope="{ row }" name="name" :row="row">
|
|
72
|
+
{{ $options.filters.fileName(row, keys.url) || row[keys.name] }}
|
|
73
|
+
</slot>
|
|
74
|
+
</el-table-column>
|
|
75
|
+
<el-table-column :label="'附件上传' | $lc">
|
|
76
|
+
<slot slot="header" slot-scope="scope" name="upload-header" :column="scope.column">{{
|
|
77
|
+
'附件上传' | $lc
|
|
78
|
+
}}</slot>
|
|
79
|
+
<slot slot-scope="{ row, $index }" name="upload" :row="row" :$index="$index">
|
|
80
|
+
<Upload
|
|
81
|
+
:ref="'upload' + $index"
|
|
82
|
+
class="n20-upload-table-up"
|
|
83
|
+
:file-name="row | fileName(keys.url)"
|
|
84
|
+
:data="row['_fileData'] || fileData"
|
|
85
|
+
:msg-type="null"
|
|
86
|
+
:show-clear="false"
|
|
87
|
+
:action="action"
|
|
88
|
+
:headers="headers"
|
|
89
|
+
:disabled="!row[keys.type] || row._typeDisabled"
|
|
90
|
+
:accept="row[keys.type] | acceptFilter(typeOptions, fileAccept)"
|
|
91
|
+
:size="row[keys.type] | sizeFilter(typeOptions, fileSize)"
|
|
92
|
+
:http-request="uploadHttpRequest ? (options) => uploadHttpRequest(options, row) : undefined"
|
|
93
|
+
:before-upload="(file) => beforeUploadFn(file, row)"
|
|
94
|
+
:on-progress="(event) => onProgressFn(event, row)"
|
|
95
|
+
:on-success="(response, file, fileList) => onSuccessFn(response, file, fileList, row)"
|
|
96
|
+
:on-error="(err, file, fileList) => errorFn(err, file, fileList, row, $index)"
|
|
97
|
+
/>
|
|
98
|
+
</slot>
|
|
238
99
|
</el-table-column>
|
|
239
|
-
<
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
</
|
|
243
|
-
<template slot-scope="{ row }">
|
|
244
|
-
<slot name="handle" :row="row">
|
|
245
|
-
<el-button type="text" icon="el-icon-view" :disabled="!row[keys.url]" @click="seeFile(row)" />
|
|
246
|
-
</slot>
|
|
247
|
-
</template>
|
|
100
|
+
<slot name="slotCol"></slot>
|
|
101
|
+
<el-table-column :label="'上传时间' | $lc" :prop="keys.time" width="170" align="center">
|
|
102
|
+
<slot slot="header" slot-scope="scope" name="time-header" :column="scope.column">{{ '上传时间' | $lc }}</slot>
|
|
103
|
+
<slot slot-scope="{ row }" name="time" :row="row">{{ row[keys.time] }}</slot>
|
|
248
104
|
</el-table-column>
|
|
249
|
-
|
|
250
|
-
|
|
105
|
+
<el-table-column :label="'上传人' | $lc" :prop="keys.user">
|
|
106
|
+
<slot slot="header" slot-scope="scope" name="user-header" :column="scope.column">{{ '上传人' | $lc }}</slot>
|
|
107
|
+
<slot slot-scope="{ row }" name="user" :row="row">{{ row[keys.user] }}</slot>
|
|
108
|
+
</el-table-column>
|
|
109
|
+
</template>
|
|
110
|
+
<el-table-column v-if="!readonly" :label="'上传进度' | $lc" width="220">
|
|
111
|
+
<template slot="header" slot-scope="scope">
|
|
112
|
+
<slot name="percent-header" :column="scope.column">{{ '上传进度' | $lc }}</slot>
|
|
113
|
+
</template>
|
|
114
|
+
<template slot-scope="{ row, $index }">
|
|
115
|
+
<slot name="percent" :row="row" :$index="$index">
|
|
116
|
+
<div v-if="row['_percent'] >= 0 && !row._typeDisabled" class="flex-box flex-v">
|
|
117
|
+
<el-progress
|
|
118
|
+
class="n20-upload-table-progress"
|
|
119
|
+
:percentage="row['_percent']"
|
|
120
|
+
:status="row['_status']"
|
|
121
|
+
text-color=""
|
|
122
|
+
style="width: 140px"
|
|
123
|
+
/>
|
|
124
|
+
<el-button
|
|
125
|
+
v-if="row['_status'] === 'exception'"
|
|
126
|
+
type="text"
|
|
127
|
+
size="mini"
|
|
128
|
+
style="width: 60px"
|
|
129
|
+
@click="anewSubmitFn(row, $index)"
|
|
130
|
+
>{{ '重新上传' | $lc }}</el-button
|
|
131
|
+
>
|
|
132
|
+
<el-button
|
|
133
|
+
v-else-if="row['_percent'] >= 0 && row['_percent'] < 100"
|
|
134
|
+
type="text"
|
|
135
|
+
size="mini"
|
|
136
|
+
style="width: 60px"
|
|
137
|
+
@click="abortFn(row, $index)"
|
|
138
|
+
>{{ '取消' | $lc }}</el-button
|
|
139
|
+
>
|
|
140
|
+
</div>
|
|
141
|
+
</slot>
|
|
142
|
+
</template>
|
|
143
|
+
</el-table-column>
|
|
144
|
+
<el-table-column :label="'操作' | $lc" align="center" width="80" fixed="right">
|
|
145
|
+
<slot slot="header" slot-scope="scope" name="handle-header" :column="scope.column">{{ '操作' | $lc }}</slot>
|
|
146
|
+
<slot slot-scope="{ row }" name="handle" :row="row">
|
|
147
|
+
<el-button type="text" icon="el-icon-view" :disabled="!row[keys.url]" @click="seeFile(row)" />
|
|
148
|
+
<el-button
|
|
149
|
+
v-if="readonly"
|
|
150
|
+
type="text"
|
|
151
|
+
icon="el-icon-download"
|
|
152
|
+
:disabled="!row[keys.url]"
|
|
153
|
+
@click="downFile(row)"
|
|
154
|
+
/>
|
|
155
|
+
</slot>
|
|
156
|
+
</el-table-column>
|
|
157
|
+
</el-table>
|
|
158
|
+
|
|
251
159
|
<Dialog
|
|
252
160
|
v-drag
|
|
253
161
|
class="p-a-0"
|
|
@@ -263,7 +171,7 @@
|
|
|
263
171
|
<img :src="previewUrl" :alt="previewName" style="display: none" />
|
|
264
172
|
</ViewerImg>
|
|
265
173
|
<component
|
|
266
|
-
:is="previewSameOrg ? 'object' : '
|
|
174
|
+
:is="previewSameOrg ? 'object' : 'object'"
|
|
267
175
|
v-else
|
|
268
176
|
:key="previewUrl"
|
|
269
177
|
:data="previewUrl"
|
|
@@ -281,6 +189,7 @@
|
|
|
281
189
|
</div>
|
|
282
190
|
</Dialog>
|
|
283
191
|
<Dialog
|
|
192
|
+
v-drag
|
|
284
193
|
:title="'附件批量上传' | $lc"
|
|
285
194
|
:visible.sync="visibleBatch"
|
|
286
195
|
top="5vh"
|
|
@@ -328,15 +237,18 @@ import Dialog from '../Dialog/index.vue'
|
|
|
328
237
|
|
|
329
238
|
import 'viewerjs/dist/viewer.css'
|
|
330
239
|
import importG from '../../utils/importGlobal.js'
|
|
240
|
+
|
|
241
|
+
const ViewerImg = async function () {
|
|
242
|
+
let { component } = await importG('v-viewer', () => import(/*webpackChunkName: "v-viewer"*/ 'v-viewer'))
|
|
243
|
+
return component
|
|
244
|
+
}
|
|
245
|
+
|
|
331
246
|
export default {
|
|
332
247
|
name: 'FileUploadTable',
|
|
333
248
|
components: {
|
|
334
249
|
Upload,
|
|
335
250
|
Dialog,
|
|
336
|
-
ViewerImg
|
|
337
|
-
let { component } = await importG('v-viewer', () => import(/*webpackChunkName: "v-viewer"*/ 'v-viewer'))
|
|
338
|
-
return component
|
|
339
|
-
}
|
|
251
|
+
ViewerImg
|
|
340
252
|
},
|
|
341
253
|
filters: {
|
|
342
254
|
typeFiter(type, typeOptions) {
|
|
@@ -483,9 +395,9 @@ export default {
|
|
|
483
395
|
this.$emit('delete-rows', this.selectionList)
|
|
484
396
|
},
|
|
485
397
|
|
|
486
|
-
async getFileInfo(row) {
|
|
398
|
+
async getFileInfo(row, type) {
|
|
487
399
|
if (this.getFileMethod) {
|
|
488
|
-
return this.getFileMethod(row)
|
|
400
|
+
return this.getFileMethod(row, type)
|
|
489
401
|
}
|
|
490
402
|
|
|
491
403
|
let _url = row[this.keys.url]
|
|
@@ -519,7 +431,7 @@ export default {
|
|
|
519
431
|
}
|
|
520
432
|
},
|
|
521
433
|
async seeFile(row) {
|
|
522
|
-
let { url, name, sameOrg } = await this.getFileInfo(row)
|
|
434
|
+
let { url, name, sameOrg } = await this.getFileInfo(row, 'preview')
|
|
523
435
|
if (url) {
|
|
524
436
|
this.previewSameOrg = sameOrg
|
|
525
437
|
this.previewUrl = url
|
|
@@ -575,18 +487,17 @@ export default {
|
|
|
575
487
|
|
|
576
488
|
let clUpload = this.$refs['upload' + $index]
|
|
577
489
|
let elUpload = clUpload.$refs['upload']
|
|
578
|
-
let uploadFiles = elUpload.uploadFiles
|
|
579
490
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
file
|
|
583
|
-
|
|
491
|
+
// let uploadFiles = elUpload.uploadFiles
|
|
492
|
+
// /* 重置文件状态,并加入文件队列 */
|
|
493
|
+
// let file = uploadFiles[uploadFiles.length - 1]
|
|
494
|
+
// file.status = 'ready'
|
|
495
|
+
// clUpload.fileList = [file]
|
|
584
496
|
|
|
585
497
|
elUpload.abort()
|
|
586
498
|
},
|
|
587
499
|
anewSubmitFn(row, $index) {
|
|
588
500
|
this.$set(row, '_status', undefined)
|
|
589
|
-
|
|
590
501
|
this.$refs['upload' + $index]?.$refs['upload']?.submit()
|
|
591
502
|
}
|
|
592
503
|
}
|
|
@@ -43,7 +43,12 @@
|
|
|
43
43
|
</template>
|
|
44
44
|
<template v-else-if="type === 'remote'">
|
|
45
45
|
<!-- 服务端保存筛选条件组 -->
|
|
46
|
-
<el-form-item
|
|
46
|
+
<el-form-item
|
|
47
|
+
v-for="(item, i) in remoteList"
|
|
48
|
+
:key="(item.slotName || item.label || '') + i"
|
|
49
|
+
class="m-b"
|
|
50
|
+
:label="item.label"
|
|
51
|
+
>
|
|
47
52
|
<slot v-if="item.slotName" :name="item.slotName"></slot>
|
|
48
53
|
<form-item-input v-else :form="form" :item="item" />
|
|
49
54
|
</el-form-item>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-popover
|
|
3
|
+
ref="filterPop"
|
|
3
4
|
v-model="showPop"
|
|
4
5
|
:width="width"
|
|
5
6
|
placement="bottom-end"
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
<div v-click-outside="clickOut" class="n20-filter p-a-s">
|
|
16
17
|
<slot></slot>
|
|
17
|
-
<el-button v-if="$slots.more" class="p-t-0 m-b-s" type="text" @click="
|
|
18
|
+
<el-button v-if="$slots.more" class="p-t-0 m-b-s" type="text" @click="handleMore"
|
|
18
19
|
><span>{{ showMore ? $lc('收起') : $lc('更多') }}{{ '条件' | $lc }}</span
|
|
19
20
|
><i :class="showMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i
|
|
20
21
|
></el-button>
|
|
@@ -93,6 +94,10 @@ export default {
|
|
|
93
94
|
this.showPop = false
|
|
94
95
|
}
|
|
95
96
|
}
|
|
97
|
+
},
|
|
98
|
+
handleMore() {
|
|
99
|
+
this.showMore = !this.showMore
|
|
100
|
+
setTimeout(() => this.$refs['filterPop'].updatePopper(), 360)
|
|
96
101
|
}
|
|
97
102
|
}
|
|
98
103
|
}
|
|
@@ -110,10 +110,8 @@ export default {
|
|
|
110
110
|
this.valueStr = this.num2str(val)
|
|
111
111
|
return
|
|
112
112
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
this.preValue = this.valueStr
|
|
116
|
-
}
|
|
113
|
+
this.valueStr = this.num2str(val)
|
|
114
|
+
this.preValue = this.valueStr
|
|
117
115
|
},
|
|
118
116
|
immediate: true
|
|
119
117
|
}
|
|
@@ -106,7 +106,9 @@ export default {
|
|
|
106
106
|
},
|
|
107
107
|
computed: {
|
|
108
108
|
activeNavC() {
|
|
109
|
-
|
|
109
|
+
let acTab = this.tabList.find((t) => t.uuid === this.activeNav)
|
|
110
|
+
let acNav = acTab?.query?.startPath || this.activeNav
|
|
111
|
+
return getShowUuid(acNav, this.menuList)
|
|
110
112
|
}
|
|
111
113
|
},
|
|
112
114
|
watch: {
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
<el-table-column label="系统名称" prop="NAME" />
|
|
83
83
|
<el-table-column label="是否在登陆页显示" align="center">
|
|
84
84
|
<template slot-scope="{ row }">
|
|
85
|
-
<el-switch v-model="row.OPEN" />
|
|
85
|
+
<el-switch v-model="row.OPEN" @change="openCg" />
|
|
86
86
|
</template>
|
|
87
87
|
</el-table-column>
|
|
88
88
|
</el-table>
|
|
@@ -91,7 +91,8 @@
|
|
|
91
91
|
label="页面展示方式"
|
|
92
92
|
:rules="{ required: true, message: '页面展示方式不能为空', trigger: 'change' }"
|
|
93
93
|
>
|
|
94
|
-
<el-select v-model="form.LOGIN_TYPE" class="input-w-u">
|
|
94
|
+
<el-select v-model="form.LOGIN_TYPE" class="input-w-u" :disabled="loginTypeDisabled">
|
|
95
|
+
<el-option label="平铺展示" value="T0" />
|
|
95
96
|
<el-option label="左右切换" value="T1" />
|
|
96
97
|
<el-option label="平铺展示" value="T2" />
|
|
97
98
|
</el-select>
|
|
@@ -131,15 +132,8 @@
|
|
|
131
132
|
</cl-expandable-pane>
|
|
132
133
|
</el-form>
|
|
133
134
|
<div class="fixed-button-shadow flex-box flex-c flex-v">
|
|
134
|
-
<el-button
|
|
135
|
-
|
|
136
|
-
@click="
|
|
137
|
-
() => {
|
|
138
|
-
save()
|
|
139
|
-
}
|
|
140
|
-
"
|
|
141
|
-
>保存</el-button
|
|
142
|
-
>
|
|
135
|
+
<el-button type="primary" @click="save()">保存</el-button>
|
|
136
|
+
<!-- <el-button @click="queryLoginPage">{{'预览' | $lc}}</el-button> -->
|
|
143
137
|
</div>
|
|
144
138
|
</div>
|
|
145
139
|
</template>
|
|
@@ -158,6 +152,7 @@ export default {
|
|
|
158
152
|
this.setingId = {}
|
|
159
153
|
return {
|
|
160
154
|
userNo: sessionStorage.getItem('userNo'),
|
|
155
|
+
loginTypeDisabled: false,
|
|
161
156
|
form: {
|
|
162
157
|
LOGIN_URL: '',
|
|
163
158
|
LOGIN_MODE: [],
|
|
@@ -275,6 +270,7 @@ export default {
|
|
|
275
270
|
})
|
|
276
271
|
}
|
|
277
272
|
}
|
|
273
|
+
this.openCg()
|
|
278
274
|
|
|
279
275
|
// this.$axios.get(`/bems/1.0/download/${this.idNo}_bg`, null, { responseType: 'blob' })
|
|
280
276
|
})
|
|
@@ -282,6 +278,14 @@ export default {
|
|
|
282
278
|
sltRow(row) {
|
|
283
279
|
this.systemItem = row
|
|
284
280
|
},
|
|
281
|
+
openCg() {
|
|
282
|
+
if (this.form.SYSTEM_LIST.filter((d) => d.OPEN).length <= 1) {
|
|
283
|
+
this.form.LOGIN_TYPE = 'T0'
|
|
284
|
+
this.loginTypeDisabled = true
|
|
285
|
+
} else {
|
|
286
|
+
this.loginTypeDisabled = false
|
|
287
|
+
}
|
|
288
|
+
},
|
|
285
289
|
async save() {
|
|
286
290
|
await this.$refs['form'].validate()
|
|
287
291
|
let errItem = this.form.SYSTEM_LIST.find((d) => d.OPEN && !d.NAME)
|
|
@@ -315,7 +319,26 @@ export default {
|
|
|
315
319
|
}
|
|
316
320
|
}
|
|
317
321
|
|
|
318
|
-
this.$axios.post(`/bems/1.0/sysSetting`, data).then((res) => {
|
|
322
|
+
this.$axios.post(`/bems/1.0/sysSetting`, data).then((res) => {
|
|
323
|
+
this.countDown()
|
|
324
|
+
})
|
|
325
|
+
},
|
|
326
|
+
Logout() {
|
|
327
|
+
this.$router.push({ path: '/login' })
|
|
328
|
+
},
|
|
329
|
+
countDown() {
|
|
330
|
+
let secondsToGo = 5
|
|
331
|
+
this.$message({
|
|
332
|
+
type: 'success',
|
|
333
|
+
message: `设置成功,系统将在 ${secondsToGo} 秒后退出到登陆页面.`
|
|
334
|
+
})
|
|
335
|
+
const interval = setInterval(() => {
|
|
336
|
+
secondsToGo -= 1
|
|
337
|
+
}, 1000)
|
|
338
|
+
setTimeout(() => {
|
|
339
|
+
clearInterval(interval)
|
|
340
|
+
this.Logout()
|
|
341
|
+
}, secondsToGo * 1000)
|
|
319
342
|
}
|
|
320
343
|
}
|
|
321
344
|
}
|
|
@@ -173,10 +173,11 @@ export default {
|
|
|
173
173
|
},
|
|
174
174
|
data() {
|
|
175
175
|
this.realUrl = realUrl
|
|
176
|
+
let { protocol, host, pathname } = window.location
|
|
176
177
|
return {
|
|
177
178
|
wrapStyle: '',
|
|
178
179
|
OL: false, // 切换到旧的登录页
|
|
179
|
-
logUrl:
|
|
180
|
+
logUrl: `${protocol}//${host}${pathname}`,
|
|
180
181
|
jsonData: {
|
|
181
182
|
loginTypes: ['account'],
|
|
182
183
|
loginBg: undefined,
|
|
@@ -474,7 +475,7 @@ export default {
|
|
|
474
475
|
.login-form {
|
|
475
476
|
position: absolute;
|
|
476
477
|
right: 103px;
|
|
477
|
-
top:
|
|
478
|
+
top: 50%;
|
|
478
479
|
transform: translateY(-50%);
|
|
479
480
|
width: 300px;
|
|
480
481
|
min-height: 340px;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<el-table
|
|
3
3
|
ref="el-table"
|
|
4
|
+
:key="colsKey"
|
|
4
5
|
:header-cell-style="{ 'text-align': 'center' }"
|
|
5
6
|
:data="data"
|
|
6
7
|
:height="height"
|
|
@@ -85,11 +86,14 @@ export default {
|
|
|
85
86
|
default: undefined
|
|
86
87
|
}
|
|
87
88
|
},
|
|
89
|
+
data() {
|
|
90
|
+
return {
|
|
91
|
+
colsKey: 0
|
|
92
|
+
}
|
|
93
|
+
},
|
|
88
94
|
watch: {
|
|
89
95
|
columns() {
|
|
90
|
-
this
|
|
91
|
-
this.$refs['el-table']?.doLayout()
|
|
92
|
-
})
|
|
96
|
+
this.colsKey = this.colsKey + 1
|
|
93
97
|
}
|
|
94
98
|
},
|
|
95
99
|
mounted() {
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
</template>
|
|
50
50
|
|
|
51
51
|
<script>
|
|
52
|
+
import _axios from 'axios'
|
|
52
53
|
import { $lc } from '../../utils/i18n/index'
|
|
53
54
|
import auth from '../../utils/auth'
|
|
54
55
|
import axios from '../../utils/axios'
|
|
@@ -244,7 +245,8 @@ export default {
|
|
|
244
245
|
}
|
|
245
246
|
}
|
|
246
247
|
|
|
247
|
-
|
|
248
|
+
let abort
|
|
249
|
+
let Pro = axios.post(opt.action, FD, {
|
|
248
250
|
headers: Object.assign(auth.setHeaders(this.headers), { 'Content-Type': 'multipart/form-data' }),
|
|
249
251
|
loading: false,
|
|
250
252
|
onUploadProgress: (arg) => {
|
|
@@ -252,8 +254,13 @@ export default {
|
|
|
252
254
|
arg.percent = arg.progress * 100
|
|
253
255
|
opt.onProgress(arg)
|
|
254
256
|
}
|
|
255
|
-
}
|
|
257
|
+
},
|
|
258
|
+
cancelToken: new _axios.CancelToken((cancel) => {
|
|
259
|
+
abort = cancel
|
|
260
|
+
})
|
|
256
261
|
})
|
|
262
|
+
Pro.abort = abort
|
|
263
|
+
return Pro
|
|
257
264
|
}
|
|
258
265
|
},
|
|
259
266
|
progressFn(event, file, fileList) {
|
package/src/utils/urlToGo.js
CHANGED
|
@@ -55,28 +55,55 @@ function buildURL(url, params) {
|
|
|
55
55
|
return url
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
export function linkPush(url,
|
|
59
|
-
|
|
60
|
-
sessionStorage.setItem(
|
|
58
|
+
export function linkPush(url = '', query = {}, $router) {
|
|
59
|
+
query._fromNo = Date.now()
|
|
60
|
+
sessionStorage.setItem(query._fromNo, location.href)
|
|
61
|
+
// 如果提供vue-router
|
|
62
|
+
if ($router && $router.options && $router.push) {
|
|
63
|
+
let base = $router.options.base || ''
|
|
64
|
+
base = base.replace(/\/$/, '')
|
|
65
|
+
base = new RegExp('^' + base)
|
|
61
66
|
|
|
62
|
-
|
|
67
|
+
if (base.test(url)) {
|
|
68
|
+
$router.push({
|
|
69
|
+
path: url.replace(base, ''),
|
|
70
|
+
query: query
|
|
71
|
+
})
|
|
72
|
+
$router = undefined
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
url = buildURL(url, query)
|
|
63
78
|
history.pushState(null, null, url)
|
|
64
79
|
}
|
|
65
80
|
|
|
66
|
-
export function linkGo() {
|
|
81
|
+
export function linkGo(N = -1, $router) {
|
|
67
82
|
let _fromUrl
|
|
68
83
|
const search = window.location.search
|
|
69
84
|
let _fromRe = search.includes('_fromNo=') ? /_fromNo=(\d+)/ : /_fromId=(\d+)/
|
|
70
85
|
let _fromM = search.match(_fromRe)
|
|
71
|
-
if (_fromM
|
|
86
|
+
if (_fromM && _fromM[1]) {
|
|
72
87
|
_fromUrl = sessionStorage.getItem(_fromM[1])
|
|
73
88
|
}
|
|
74
89
|
|
|
75
90
|
if (_fromUrl) {
|
|
91
|
+
// 如果提供vue-router
|
|
92
|
+
if ($router && $router.options && $router.push) {
|
|
93
|
+
let base = $router.options.base || ''
|
|
94
|
+
base = base.replace(/\/$/, '')
|
|
95
|
+
base = new RegExp('^' + base)
|
|
96
|
+
|
|
97
|
+
if (base.test(_fromUrl)) {
|
|
98
|
+
$router.push(_fromUrl.replace(base, ''))
|
|
99
|
+
$router = undefined
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
}
|
|
76
103
|
// window.history.go(-1)
|
|
77
104
|
// window.history.replaceState(null, null, _fromUrl)
|
|
78
105
|
history.pushState(null, null, _fromUrl)
|
|
79
106
|
} else {
|
|
80
|
-
window.history.go(
|
|
107
|
+
window.history.go(N)
|
|
81
108
|
}
|
|
82
109
|
}
|