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="pagedRows"
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="filteredRows.length"
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
- get("/meeting/list", params)
336
- .then(res => {
337
- if (res && res.data) {
338
- this.rows = res.data;
339
- } else if (Array.isArray(res)) {
340
- this.rows = res;
341
- }
342
- })
343
- .catch(() => {
344
- this.$message.error("获取会议列表失败");
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2server",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "dev": "nodemon --watch src --ext ts --exec \"ts-node src/app.ts\"",
@@ -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 (_req: Request, res: Response, next: NextFunction): Promise<void> => {
6
+ getMeetingList = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
7
7
  try {
8
- const data = await meetingService.getMeetingList();
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
- export const getMeetingList = async () => {
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
+ };