vue2server 1.0.7 → 1.0.8
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.
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
<el-table
|
|
99
99
|
ref="meetingTable"
|
|
100
100
|
:key="tableKey"
|
|
101
|
-
:data="
|
|
101
|
+
:data="rows"
|
|
102
102
|
border
|
|
103
103
|
stripe
|
|
104
104
|
size="small"
|
|
@@ -199,7 +199,7 @@
|
|
|
199
199
|
layout="total, prev, pager, next"
|
|
200
200
|
:current-page.sync="page"
|
|
201
201
|
:page-size="pageSize"
|
|
202
|
-
:total="
|
|
202
|
+
:total="totalCount"
|
|
203
203
|
@current-change="onPageChange"
|
|
204
204
|
/>
|
|
205
205
|
</div>
|
|
@@ -223,8 +223,8 @@ export default {
|
|
|
223
223
|
{ key: "createDate", prop: "createTm", label: "创建日期", width: 160, align: "center", type: "createDate", sortable: "custom" },
|
|
224
224
|
{ key: "updateDate", prop: "updateTm", label: "最近编辑时间", width: 190, align: "center", type: "updateDate", sortable: "custom" }
|
|
225
225
|
],
|
|
226
|
-
// 示例数据:模拟接口返回的会议列表,用于本地展示
|
|
227
226
|
rows: [],
|
|
227
|
+
totalCount: 0,
|
|
228
228
|
// 查询条件
|
|
229
229
|
filters: {
|
|
230
230
|
belOrgNo: "",
|
|
@@ -276,53 +276,9 @@ export default {
|
|
|
276
276
|
this.headerSortable = null;
|
|
277
277
|
}
|
|
278
278
|
},
|
|
279
|
-
computed: {
|
|
280
|
-
// 根据查询条件得到过滤后的数据列表
|
|
281
|
-
filteredRows() {
|
|
282
|
-
const subj = (this.filters.meetSubj || "").trim();
|
|
283
|
-
const belOrgNo = this.filters.belOrgNo || "";
|
|
284
|
-
const meetTypeCd = this.filters.meetTypeCd || "";
|
|
285
|
-
const [start, end] = Array.isArray(this.filters.createDateRange) ? this.filters.createDateRange : [];
|
|
286
|
-
|
|
287
|
-
const list = this.rows.filter(row => {
|
|
288
|
-
if (belOrgNo && row.belOrgNo !== belOrgNo) return false;
|
|
289
|
-
if (meetTypeCd && row.meetTypeCd !== meetTypeCd) return false;
|
|
290
|
-
if (subj && !row.meetSubj.includes(subj)) return false;
|
|
291
|
-
if (start && end) {
|
|
292
|
-
const d = row.createTm;
|
|
293
|
-
if (!d || d < start || d > end) return false;
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
if (this.sortField && this.sortOrder) {
|
|
299
|
-
const field = this.sortField;
|
|
300
|
-
const order = this.sortOrder === "ascending" ? 1 : -1;
|
|
301
|
-
list.sort((a, b) => {
|
|
302
|
-
const av = this.getTimeValue(a[field]);
|
|
303
|
-
const bv = this.getTimeValue(b[field]);
|
|
304
|
-
if (av === bv) return 0;
|
|
305
|
-
return av > bv ? order : -order;
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return list;
|
|
310
|
-
},
|
|
311
|
-
// 当前页应显示的数据(在 filteredRows 基础上做前端分页)
|
|
312
|
-
pagedRows() {
|
|
313
|
-
const start = (this.page - 1) * this.pageSize;
|
|
314
|
-
return this.filteredRows.slice(start, start + this.pageSize);
|
|
315
|
-
}
|
|
316
|
-
},
|
|
317
|
-
watch: {
|
|
318
|
-
// 当过滤后的数据量变化时,自动纠正当前页,避免超出最大页码
|
|
319
|
-
filteredRows() {
|
|
320
|
-
const maxPage = Math.max(1, Math.ceil(this.filteredRows.length / this.pageSize) || 1);
|
|
321
|
-
if (this.page > maxPage) this.page = maxPage;
|
|
322
|
-
}
|
|
323
|
-
},
|
|
279
|
+
computed: {},
|
|
324
280
|
methods: {
|
|
325
|
-
fetchData() {
|
|
281
|
+
async fetchData(allowRetry = true) {
|
|
326
282
|
const params = {};
|
|
327
283
|
const { belOrgNo, meetSubj, meetTypeCd, createDateRange } = this.filters;
|
|
328
284
|
if (belOrgNo) params.belOrgNo = belOrgNo;
|
|
@@ -332,17 +288,32 @@ export default {
|
|
|
332
288
|
params.startDate = createDateRange[0];
|
|
333
289
|
params.endDate = createDateRange[1];
|
|
334
290
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
.
|
|
344
|
-
this
|
|
345
|
-
|
|
291
|
+
params.page = this.page;
|
|
292
|
+
params.pageSize = this.pageSize;
|
|
293
|
+
if (this.sortField && this.sortOrder) {
|
|
294
|
+
params.sortField = this.sortField;
|
|
295
|
+
params.sortOrder = this.sortOrder;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
const res = await get("/meeting/list", params);
|
|
299
|
+
if (res && res.list) {
|
|
300
|
+
this.rows = Array.isArray(res.list) ? res.list : [];
|
|
301
|
+
this.totalCount = Number.isFinite(res.total) ? res.total : this.rows.length;
|
|
302
|
+
} else if (Array.isArray(res)) {
|
|
303
|
+
this.rows = res;
|
|
304
|
+
this.totalCount = res.length;
|
|
305
|
+
} else {
|
|
306
|
+
this.rows = [];
|
|
307
|
+
this.totalCount = 0;
|
|
308
|
+
}
|
|
309
|
+
const maxPage = Math.max(1, Math.ceil(this.totalCount / this.pageSize));
|
|
310
|
+
if (allowRetry && this.page > maxPage) {
|
|
311
|
+
this.page = maxPage;
|
|
312
|
+
await this.fetchData(false);
|
|
313
|
+
}
|
|
314
|
+
} catch (e) {
|
|
315
|
+
this.$message.error("获取会议列表失败");
|
|
316
|
+
}
|
|
346
317
|
},
|
|
347
318
|
/**
|
|
348
319
|
* 初始化表头拖拽
|
|
@@ -394,6 +365,7 @@ export default {
|
|
|
394
365
|
this.sortField = prop || "";
|
|
395
366
|
this.sortOrder = order || "";
|
|
396
367
|
this.page = 1;
|
|
368
|
+
this.fetchData();
|
|
397
369
|
},
|
|
398
370
|
// 点击“查询”:重置到第一页并重新请求接口
|
|
399
371
|
onSearch() {
|
|
@@ -414,6 +386,7 @@ export default {
|
|
|
414
386
|
// 分页器切换页码
|
|
415
387
|
onPageChange(p) {
|
|
416
388
|
this.page = p;
|
|
389
|
+
this.fetchData();
|
|
417
390
|
},
|
|
418
391
|
// 将会议类型编码转换为中文文案
|
|
419
392
|
formatMeetType(code) {
|
|
@@ -452,13 +425,6 @@ export default {
|
|
|
452
425
|
const ss = String(d.getSeconds()).padStart(2, "0");
|
|
453
426
|
return `${yyyy}-${mm}-${dd} ${hh}:${mi}:${ss}`;
|
|
454
427
|
},
|
|
455
|
-
// 将各种形式的日期值转换为时间戳,用于排序
|
|
456
|
-
getTimeValue(value) {
|
|
457
|
-
if (!value) return 0;
|
|
458
|
-
const d = new Date(value);
|
|
459
|
-
if (Number.isNaN(d.getTime())) return 0;
|
|
460
|
-
return d.getTime();
|
|
461
|
-
},
|
|
462
428
|
// 点击“详情”:弹出对话框展示会议详细信息
|
|
463
429
|
onView(row) {
|
|
464
430
|
const lines = [
|
package/package.json
CHANGED
|
@@ -3,9 +3,20 @@ import { Request, Response, NextFunction } from "express";
|
|
|
3
3
|
import * as meetingService from "../services/meeting.service";
|
|
4
4
|
|
|
5
5
|
class MeetingController {
|
|
6
|
-
getMeetingList = async (
|
|
6
|
+
getMeetingList = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
|
|
7
7
|
try {
|
|
8
|
-
const
|
|
8
|
+
const { belOrgNo, meetSubj, meetTypeCd, startDate, endDate, page, pageSize, sortField, sortOrder } = req.query;
|
|
9
|
+
const data = await meetingService.getMeetingList({
|
|
10
|
+
belOrgNo,
|
|
11
|
+
meetSubj,
|
|
12
|
+
meetTypeCd,
|
|
13
|
+
startDate,
|
|
14
|
+
endDate,
|
|
15
|
+
page,
|
|
16
|
+
pageSize,
|
|
17
|
+
sortField,
|
|
18
|
+
sortOrder
|
|
19
|
+
});
|
|
9
20
|
res.json({
|
|
10
21
|
data
|
|
11
22
|
});
|
|
@@ -16,4 +27,3 @@ class MeetingController {
|
|
|
16
27
|
}
|
|
17
28
|
|
|
18
29
|
export default new MeetingController();
|
|
19
|
-
|
|
@@ -1,4 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
type Meeting = {
|
|
2
|
+
id: number;
|
|
3
|
+
belOrgNo: string;
|
|
4
|
+
organizationName: string;
|
|
5
|
+
meetSubj: string;
|
|
6
|
+
meetConte: string;
|
|
7
|
+
plainContent: string;
|
|
8
|
+
meetDt: string;
|
|
9
|
+
meetNo: string;
|
|
10
|
+
meetTypeCd: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
createTm: string;
|
|
13
|
+
updateTm: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type GetMeetingListInput = {
|
|
17
|
+
belOrgNo?: unknown;
|
|
18
|
+
meetSubj?: unknown;
|
|
19
|
+
meetTypeCd?: unknown;
|
|
20
|
+
startDate?: unknown;
|
|
21
|
+
endDate?: unknown;
|
|
22
|
+
page?: unknown;
|
|
23
|
+
pageSize?: unknown;
|
|
24
|
+
sortField?: unknown;
|
|
25
|
+
sortOrder?: unknown;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type GetMeetingListResult = {
|
|
29
|
+
list: Meeting[];
|
|
30
|
+
total: number;
|
|
31
|
+
page: number;
|
|
32
|
+
pageSize: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
function getAllMeetings(): Meeting[] {
|
|
2
36
|
return [
|
|
3
37
|
{
|
|
4
38
|
id: 33029032315325800,
|
|
@@ -29,5 +63,85 @@ export const getMeetingList = async () => {
|
|
|
29
63
|
updateTm: "2026-01-15 19:56:24"
|
|
30
64
|
}
|
|
31
65
|
];
|
|
32
|
-
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function toInt(value: unknown, fallback: number): number {
|
|
69
|
+
if (typeof value === "number" && Number.isFinite(value)) return Math.floor(value);
|
|
70
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
71
|
+
const parsed = Number.parseInt(value, 10);
|
|
72
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
73
|
+
}
|
|
74
|
+
return fallback;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function normalizeString(value: unknown): string {
|
|
78
|
+
if (typeof value !== "string") return "";
|
|
79
|
+
return value.trim();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function normalizeDateString(value: unknown): string {
|
|
83
|
+
if (typeof value !== "string") return "";
|
|
84
|
+
const trimmed = value.trim();
|
|
85
|
+
if (!trimmed) return "";
|
|
86
|
+
return trimmed.slice(0, 10);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function getTimeValue(value: unknown): number {
|
|
90
|
+
if (!value) return 0;
|
|
91
|
+
const str = typeof value === "string" ? value : String(value);
|
|
92
|
+
const normalized = str.length >= 10 ? str : str.slice(0, 10);
|
|
93
|
+
const d = new Date(normalized);
|
|
94
|
+
if (Number.isNaN(d.getTime())) return 0;
|
|
95
|
+
return d.getTime();
|
|
96
|
+
}
|
|
33
97
|
|
|
98
|
+
export const getMeetingList = async (input: GetMeetingListInput): Promise<GetMeetingListResult> => {
|
|
99
|
+
const belOrgNo = normalizeString(input.belOrgNo);
|
|
100
|
+
const meetSubj = normalizeString(input.meetSubj);
|
|
101
|
+
const meetTypeCd = normalizeString(input.meetTypeCd);
|
|
102
|
+
const startDate = normalizeDateString(input.startDate);
|
|
103
|
+
const endDate = normalizeDateString(input.endDate);
|
|
104
|
+
|
|
105
|
+
const pageSize = Math.max(1, Math.min(200, toInt(input.pageSize, 10)));
|
|
106
|
+
const page = Math.max(1, toInt(input.page, 1));
|
|
107
|
+
|
|
108
|
+
const sortField = normalizeString(input.sortField);
|
|
109
|
+
const sortOrder = input.sortOrder === "ascending" || input.sortOrder === "descending" ? input.sortOrder : "";
|
|
110
|
+
|
|
111
|
+
const all = getAllMeetings();
|
|
112
|
+
|
|
113
|
+
const filtered = all.filter((item) => {
|
|
114
|
+
if (belOrgNo && item.belOrgNo !== belOrgNo) return false;
|
|
115
|
+
if (meetTypeCd && item.meetTypeCd !== meetTypeCd) return false;
|
|
116
|
+
if (meetSubj && !item.meetSubj.includes(meetSubj)) return false;
|
|
117
|
+
if (startDate && endDate) {
|
|
118
|
+
const created = normalizeDateString(item.createTm);
|
|
119
|
+
if (!created || created < startDate || created > endDate) return false;
|
|
120
|
+
}
|
|
121
|
+
return true;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
let sorted = filtered.slice();
|
|
125
|
+
|
|
126
|
+
if (sortField && sortOrder && (sortField === "createTm" || sortField === "updateTm")) {
|
|
127
|
+
const field = sortField as "createTm" | "updateTm";
|
|
128
|
+
const order = sortOrder === "ascending" ? 1 : -1;
|
|
129
|
+
sorted = sorted.sort((a, b) => {
|
|
130
|
+
const av = getTimeValue(a[field]);
|
|
131
|
+
const bv = getTimeValue(b[field]);
|
|
132
|
+
if (av === bv) return 0;
|
|
133
|
+
return av > bv ? order : -order;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const total = sorted.length;
|
|
138
|
+
const start = (page - 1) * pageSize;
|
|
139
|
+
const list = sorted.slice(start, start + pageSize);
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
list,
|
|
143
|
+
total,
|
|
144
|
+
page,
|
|
145
|
+
pageSize
|
|
146
|
+
};
|
|
147
|
+
};
|