index.vue 6.34 KB
<script setup lang="ts">
import { reactive, ref, onMounted } from "vue";
import { notifyList, notifyDelete } from "@/api/notify";
import { parseTime } from "@/utils/tool";
import Pagination from "@/components/Pagination/index.vue";
import { ElMessageBox, ElMessage } from "element-plus";
import type { ElTable } from "element-plus";
interface Form {
  page: number;
  pageSize: number;
  beginTime: string;
  endTime: string;
}
interface Params {
  total: number;
  query: Form;
}
interface Data {
  loading: boolean;
  list: any[] | null;
  params: Params;
}
const multipleTableRef = ref<InstanceType<typeof ElTable>>();
let multipleSelection = ref<any[]>([]);
const value1 = ref([]);
let data = reactive({
  list: [],
  loading: false,
  params: {
    total: 0,
    query: {
      page: 1,
      pageSize: 10,
      beginTime: "",
      endTime: "",
      neighborHoodName: ""
    },
  },
});
/**
 * 状态值
 * @enum {number}
 */
enum statusEnum {
  "草稿" = 0,
  "已发布",
}
/**
 * 列表
 */
const getList = async () => {
  data.loading = true;
  try {
    const res = await notifyList(data.params.query);
    data.list = res?.data?.data?.list;
    data.params.total = res?.data?.data?.total;
  } catch (e) {
    console.log(e);
  } finally {
    data.loading = false;
  }
};
/**
 * 表格选中响应
 * @param {array} data 选中的一条数据
 */
const handleSelectionChange = (data: array) => {
  multipleSelection.value = data;
};
/**
 * 时间组件回调
 * @param {array} value [开始时间, 结束时间]
 */
const handleTimeChange = (value: array) => {
  data.params.query.beginTime = value ? value[0] : "";
  data.params.query.endTime = value ? value[1] : "";
  getList();
};
/**
 * 表格每一行是否可选中
 * @param {array} row 每一行数据对象
 */
const isSelectable = (row: any) => {
  return row.status === 0;
};
/**
 * 删除
 * @param {object} obj 要删除的数据对象
 */
const handleDelete = (obj: any) => {
  ElMessageBox.confirm("确认删除吗?", "警告", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(async () => {
      try {
        let res = await notifyDelete({
          ids: obj.id,
        });
        if (res?.data) {
          ElMessage({
            type: "success",
            message: "操作成功",
          });
          getList();
        } else {
          ElMessage({
            type: "error",
            message: "操作失败",
          });
        }
      } catch (e) {
        console.log(e);
      }
    })
    .catch(() => {
      console.log("取消");
    });
};
onMounted(() => {
  getList();
});
</script>

<template>
  <div class="page-container">
    <h1>公告列表</h1>
    <el-row style="padding-bottom: 20px">
      <el-form :inline="true" label-width="70px">
        <el-form-item label="小区名称">
          <el-input
            v-model.trim="data.params.query.neighborHoodName"
            placeholder="请填写小区名称"
            maxlength="15"
            @change="getList"
          />
        </el-form-item>
        <el-form-item label="时间">
          <el-date-picker
            v-model="value1"
            type="datetimerange"
            range-separator="至"
            format="YYYY-MM-DD HH:mm:ss"
            value-format="YYYY-MM-DD HH:mm:ss"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            @change="handleTimeChange"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="getList">查询</el-button>
          <el-button type="primary">
            <router-link to="/notify/edit">新增公告</router-link>
          </el-button>
          <el-button
            type="danger"
            @click="
              handleDelete({ id: multipleSelection.map((i) => i.id).join(',') })
            "
            :disabled="!multipleSelection.length"
            >批量删除</el-button
          >
        </el-form-item>
      </el-form>
    </el-row>
    <el-table
      :data="data.list"
      style="width: 100%"
      border
      v-loading="data.loading"
      align="center"
      element-loading-text="拼命加载中"
      ref="multipleTableRef"
      @selection-change="handleSelectionChange"
    >
      <el-table-column
        type="selection"
        align="center"
        :selectable="isSelectable"
      />
      <el-table-column prop="id" label="ID" align="center"></el-table-column>
      <el-table-column
        prop="title"
        label="标题"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="content"
        label="内容"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="neighborHoodName"
        label="小区"
        align="center"
      ></el-table-column>
      <el-table-column prop="status" label="状态" align="center">
        <template #default="scope">
          {{ statusEnum[scope.row.status] }}
        </template>
      </el-table-column>
      <el-table-column prop="createTime" label="发布时间" align="center">
        <template #default="scope">
          {{ parseTime(new Date(scope.row.createTime).getTime()) }}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <!-- 已发布状态的公告不可以被修改、删除 -->
        <template #default="scope">
          <el-button type="text" v-show="scope.row.status === 0"
            ><router-link
              :to="{
                path: '/notify/edit',
                query: { ...scope.row, ...{ dataType: 'edit' } },
              }"
              >编辑</router-link
            ></el-button
          >
          <el-button type="text"
            ><router-link
              :to="{
                path: '/notify/edit',
                query: { ...scope.row, ...{ dataType: 'detail' } },
              }"
              >详情</router-link
            ></el-button
          >
          <el-button
            type="text"
            @click="handleDelete(scope.row)"
            v-show="scope.row.status === 0"
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <Pagination
      :total="data.params.total"
      v-model:currentPage="data.params.query.page"
      v-model:pageSize="data.params.query.pageSize"
      @pageChange="getList"
    ></Pagination>
  </div>
</template>