vue2server 1.0.7 → 1.0.9
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() {
|
|
326
282
|
const params = {};
|
|
327
283
|
const { belOrgNo, meetSubj, meetTypeCd, createDateRange } = this.filters;
|
|
328
284
|
if (belOrgNo) params.belOrgNo = belOrgNo;
|
|
@@ -332,17 +288,19 @@ 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
|
-
|
|
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
|
+
this.rows = Array.isArray(res.list) ? res.list : [];
|
|
300
|
+
this.totalCount = Number.isFinite(res.total) ? res.total : this.rows.length;
|
|
301
|
+
} catch (e) {
|
|
302
|
+
this.$message.error("获取会议列表失败");
|
|
303
|
+
}
|
|
346
304
|
},
|
|
347
305
|
/**
|
|
348
306
|
* 初始化表头拖拽
|
|
@@ -394,6 +352,7 @@ export default {
|
|
|
394
352
|
this.sortField = prop || "";
|
|
395
353
|
this.sortOrder = order || "";
|
|
396
354
|
this.page = 1;
|
|
355
|
+
this.fetchData();
|
|
397
356
|
},
|
|
398
357
|
// 点击“查询”:重置到第一页并重新请求接口
|
|
399
358
|
onSearch() {
|
|
@@ -414,6 +373,7 @@ export default {
|
|
|
414
373
|
// 分页器切换页码
|
|
415
374
|
onPageChange(p) {
|
|
416
375
|
this.page = p;
|
|
376
|
+
this.fetchData();
|
|
417
377
|
},
|
|
418
378
|
// 将会议类型编码转换为中文文案
|
|
419
379
|
formatMeetType(code) {
|
|
@@ -452,13 +412,6 @@ export default {
|
|
|
452
412
|
const ss = String(d.getSeconds()).padStart(2, "0");
|
|
453
413
|
return `${yyyy}-${mm}-${dd} ${hh}:${mi}:${ss}`;
|
|
454
414
|
},
|
|
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
415
|
// 点击“详情”:弹出对话框展示会议详细信息
|
|
463
416
|
onView(row) {
|
|
464
417
|
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
|
+
};
|