From f56e474c81bb25845b46cf99c85bd313dbfcd3b5 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期六, 31 一月 2026 19:26:25 +0800
Subject: [PATCH] 项目初始化+首页+公告详情页面

---
 src/views/main/components/DataTable.vue |  132 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 132 insertions(+), 0 deletions(-)

diff --git a/src/views/main/components/DataTable.vue b/src/views/main/components/DataTable.vue
new file mode 100644
index 0000000..593747f
--- /dev/null
+++ b/src/views/main/components/DataTable.vue
@@ -0,0 +1,132 @@
+<template>
+  <div class="mt-4 mb-2">
+    <el-table 
+      :data="showList" 
+      table-layout="auto" 
+      stripe
+      :empty-text="emptyText"
+      style="width: 100%"
+    >
+      <el-table-column v-if="selectionFlag" type="selection" width="55" />
+      <el-table-column
+        v-for="(item,index) in headers" :key="index" 
+        :prop="item.value" 
+        :label="item.label" 
+        :width="item.width"
+        :align="item.align || 'center'"
+        :sortable="item.sortable"
+      >
+        <template v-if="$slots[item.value]" #default="scope">
+          <slot :name="item.value" v-bind="scope"></slot>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-row class="mt-4" align="middle" justify="end" v-if="paginator">
+      <el-pagination
+        v-model:current-page="page"
+        v-model:page-size="size"
+        :page-sizes="pageSize"
+        background
+        :layout="layout"
+        :total="totalCount || list.length"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </el-row>
+  </div>
+</template>
+
+<script>
+
+export default {
+  data() {
+    return {
+      pageSize: [12, 24, 36, 48],
+      page: 1,
+      size: 12,
+      showList: [],
+    }
+  },
+  props: {
+    filter: {
+      type: Object,
+      default: () => { return { pageNo: 1, pageSize: 12 } }
+    },
+    headers: {
+      type: Array,
+      default: () => []
+    },
+    list: {
+      type: Array,
+      default: () => []
+    },
+    totalCount: {
+      type: Number,
+      default: 0
+    },
+    layout: {
+      type: String,
+      default: 'total, sizes, prev, pager, next, jumper'
+    },
+    selectionFlag: {
+      type: Boolean,
+      default: false
+    },
+    emptyText: {
+      type: String,
+      default: '鏆傛棤鏁版嵁'
+    },
+    paginator: { 
+      type: Boolean,
+      default: true
+    }
+  },
+  watch: {
+    list: {
+      handler() {
+        this.updateShowList()
+      },
+      immediate: true
+    },
+    'filter.page': function(val) {
+      this.page = val
+    },
+    'filter.size': function(val) {
+      this.size = val
+    }
+  },
+  methods: {
+    handleSizeChange() {
+      this.$emit('update:filter', {
+        ...this.filter,
+        size: this.size
+      })
+      this.updateShowList()
+    },
+    handleCurrentChange() {
+      this.$emit('update:filter', {
+        ...this.filter,
+        page: this.page,
+      })
+      this.updateShowList()
+    },
+    updateShowList() {
+      if (this.paginator) {
+        this.showList = this.list.slice((this.page - 1) * this.size, this.page * this.size)
+      } else {
+        this.showList = this.list
+      }
+      
+    }
+  }
+}
+
+</script>
+
+<style>
+.el-table th.el-table__cell {
+  padding: 12px 0;
+  background-color: #fafafa;
+}
+</style>
+

--
Gitblit v1.8.0