|
|
@@ -0,0 +1,279 @@
|
|
|
+<script setup>
|
|
|
+import { reactive, ref, watch } from "vue"
|
|
|
+import { getTableDataApi } from "@/api/table"
|
|
|
+import { ElMessageBox } from "element-plus"
|
|
|
+import { usePagination } from "@/hooks/usePagination"
|
|
|
+
|
|
|
+const loading = ref(false)
|
|
|
+const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
|
|
|
+
|
|
|
+//#region 详情
|
|
|
+const dialogVisible = ref(false)
|
|
|
+const formData = ref({})
|
|
|
+const handleUpdate = (row) => {
|
|
|
+ dialogVisible.value = true
|
|
|
+ formData.value = cloneDeep(row)
|
|
|
+}
|
|
|
+//#endregion
|
|
|
+
|
|
|
+//#region 查
|
|
|
+const tableData = ref([])
|
|
|
+const searchFormRef = ref(null)
|
|
|
+const searchData = reactive({
|
|
|
+ organizationName: undefined,
|
|
|
+ initiator: undefined,
|
|
|
+ theme: undefined,
|
|
|
+ college: undefined,
|
|
|
+ stage: undefined,
|
|
|
+ major: undefined,
|
|
|
+ class: undefined,
|
|
|
+ status: undefined,
|
|
|
+ createTime: null,
|
|
|
+ activityTime: null,
|
|
|
+ registrationTime: null
|
|
|
+})
|
|
|
+const getTableData = () => {
|
|
|
+ loading.value = true
|
|
|
+ getTableDataApi({
|
|
|
+ currentPage: paginationData.currentPage,
|
|
|
+ size: paginationData.pageSize,
|
|
|
+ organizationName: searchData.organizationName,
|
|
|
+ initiator: searchData.initiator,
|
|
|
+ theme: searchData.theme,
|
|
|
+ college: searchData.college,
|
|
|
+ stage: searchData.stage,
|
|
|
+ major: searchData.major,
|
|
|
+ class: searchData.class,
|
|
|
+ status: searchData.status,
|
|
|
+ starTime: searchData.createTime ? searchData.createTime[0] : undefined,
|
|
|
+ endTime: searchData.createTime ? searchData.createTime[1] : undefined,
|
|
|
+ starTime2: searchData.activityTime ? searchData.activityTime[0] : undefined,
|
|
|
+ endTime2: searchData.activityTime ? searchData.activityTime[1] : undefined,
|
|
|
+ starTime3: searchData.registrationTime ? searchData.registrationTime[0] : undefined,
|
|
|
+ endTime3: searchData.registrationTime ? searchData.registrationTime[1] : undefined
|
|
|
+ })
|
|
|
+ .then(({ data }) => {
|
|
|
+ paginationData.total = data.total
|
|
|
+ tableData.value = data.list
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ tableData.value = []
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ loading.value = false
|
|
|
+ })
|
|
|
+}
|
|
|
+const handleSearch = () => {
|
|
|
+ paginationData.currentPage === 1 ? getTableData() : (paginationData.currentPage = 1)
|
|
|
+}
|
|
|
+const resetSearch = () => {
|
|
|
+ searchFormRef.value?.resetFields()
|
|
|
+ handleSearch()
|
|
|
+}
|
|
|
+//#endregion
|
|
|
+
|
|
|
+/** 监听分页参数的变化 */
|
|
|
+watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
|
|
|
+
|
|
|
+/** 通过 */
|
|
|
+const handlePass = (row) => {
|
|
|
+ ElMessageBox.confirm("确认通过?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning"
|
|
|
+ }).then(() => {
|
|
|
+ // todo 调用通过接口
|
|
|
+ console.log(row)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+/** 拒绝 */
|
|
|
+const handleReject = (row) => {
|
|
|
+ ElMessageBox.confirm("确认拒绝?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning"
|
|
|
+ }).then(() => {
|
|
|
+ // todo 调用拒绝接口
|
|
|
+ console.log(row)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+/** 导出 */
|
|
|
+const handleDownload = () => {
|
|
|
+ // todo 调用导出接口
|
|
|
+ console.log("导出")
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+ <el-card v-loading="loading" header="审核列表">
|
|
|
+ <div class="toolbar-wrapper">
|
|
|
+ <el-form ref="searchFormRef" :inline="true" :model="searchData">
|
|
|
+ <el-form-item prop="organizationName" label="组织名称">
|
|
|
+ <el-input v-model="searchData.organizationName" placeholder="请输入" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="initiator" label="发起人">
|
|
|
+ <el-input v-model="searchData.initiator" placeholder="请输入" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="theme" label="活动主题">
|
|
|
+ <el-input v-model="searchData.theme" placeholder="请输入" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="college" label="学院">
|
|
|
+ <el-select v-model="searchData.college" placeholder="请选择" style="width: 178px">
|
|
|
+ <el-option label="todo" value="todo" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="stage" label="学段">
|
|
|
+ <el-select v-model="searchData.stage" placeholder="请选择" style="width: 178px">
|
|
|
+ <el-option label="todo" value="todo" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="major" label="专业">
|
|
|
+ <el-select v-model="searchData.major" placeholder="请选择" style="width: 178px">
|
|
|
+ <el-option label="todo" value="todo" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="class" label="班级">
|
|
|
+ <el-select v-model="searchData.class" placeholder="请选择" style="width: 178px">
|
|
|
+ <el-option label="todo" value="todo" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="status" label="状态">
|
|
|
+ <el-select v-model="searchData.status" placeholder="请选择" style="width: 178px">
|
|
|
+ <el-option label="todo" value="todo" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="createTime" label="创建时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="searchData.createTime"
|
|
|
+ type="datetimerange"
|
|
|
+ start-placeholder="开始时间"
|
|
|
+ end-placeholder="结束时间"
|
|
|
+ value-format="x"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="activityTime" label="活动时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="searchData.activityTime"
|
|
|
+ type="datetimerange"
|
|
|
+ start-placeholder="开始时间"
|
|
|
+ end-placeholder="结束时间"
|
|
|
+ value-format="x"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="registrationTime" label="报名时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="searchData.registrationTime"
|
|
|
+ type="datetimerange"
|
|
|
+ start-placeholder="开始时间"
|
|
|
+ end-placeholder="结束时间"
|
|
|
+ value-format="x"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" @click="handleSearch">查询</el-button>
|
|
|
+ <el-button @click="resetSearch" plain>重置</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div>
|
|
|
+ <el-button plain @click="handleDownload">导出</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="table-wrapper">
|
|
|
+ <el-table :data="tableData" max-height="500">
|
|
|
+ <el-table-column type="index" label="序号" width="100" align="center" />
|
|
|
+ <el-table-column prop="initiator" label="发起人" align="center" />
|
|
|
+ <el-table-column prop="college" label="学院" align="center" />
|
|
|
+ <el-table-column prop="stage" label="学段" align="center" />
|
|
|
+ <el-table-column prop="major" label="专业" align="center" />
|
|
|
+ <el-table-column prop="class" label="班级" align="center" />
|
|
|
+ <el-table-column prop="organizationName" label="所属组织" align="center" />
|
|
|
+ <el-table-column prop="theme" label="活动主题" align="center" />
|
|
|
+ <el-table-column prop="activityTime" label="活动开始时间" align="center" />
|
|
|
+ <el-table-column prop="registrationTime" label="报名开始时间" align="center" />
|
|
|
+ <el-table-column prop="todo" label="已报名" align="center" />
|
|
|
+ <el-table-column prop="todo" label="已签到" align="center" />
|
|
|
+ <el-table-column prop="status" label="状态" align="center" />
|
|
|
+ <el-table-column prop="todo" label="审核人" align="center" />
|
|
|
+ <el-table-column prop="todo" label="审核时间" align="center" />
|
|
|
+ <el-table-column prop="createTime" label="创建时间" align="center" />
|
|
|
+ <el-table-column fixed="right" label="操作" width="200" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-link type="primary" @click="handleUpdate(scope.row)">详情</el-link>
|
|
|
+ <el-link type="danger" @click="handleReject(scope.row)">拒绝</el-link>
|
|
|
+ <el-link type="success" @click="handlePass(scope.row)">同意</el-link>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="pager-wrapper">
|
|
|
+ <el-pagination
|
|
|
+ background
|
|
|
+ :layout="paginationData.layout"
|
|
|
+ :page-sizes="paginationData.pageSizes"
|
|
|
+ :total="paginationData.total"
|
|
|
+ :page-size="paginationData.pageSize"
|
|
|
+ :currentPage="paginationData.currentPage"
|
|
|
+ @size-change="handleSizeChange"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ <!-- 详情 -->
|
|
|
+ <el-dialog v-model="dialogVisible" title="详情" @closed="resetForm" width="50%">
|
|
|
+ <div>
|
|
|
+ <h2>欢迎加入上海足球协会</h2>
|
|
|
+ <p>时间:2024-02-0216:53至2024-12-31 20:53</p>
|
|
|
+ <p>地点:上海市嘉定区安辰路999号</p>
|
|
|
+ <img src="@/assets/image.png" width="100%" />
|
|
|
+ <p>详情...</p>
|
|
|
+ <h3>已报名 (12 人)</h3>
|
|
|
+ <div class="user-list">
|
|
|
+ <div class="user-item" v-for="(item, index) in 10" :key="index">
|
|
|
+ <el-avatar :size="40" src="" />
|
|
|
+ <span>姓名</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <h3>签到人员 (12 人)</h3>
|
|
|
+ <div class="user-list">
|
|
|
+ <div class="user-item" v-for="(item, index) in 10" :key="index">
|
|
|
+ <el-avatar :size="40" src="" />
|
|
|
+ <span>姓名</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.toolbar-wrapper {
|
|
|
+ margin-bottom: 26px;
|
|
|
+}
|
|
|
+
|
|
|
+.table-wrapper {
|
|
|
+ margin-bottom: 29px;
|
|
|
+ .el-link {
|
|
|
+ margin-right: 15px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.pager-wrapper {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+
|
|
|
+.user-list {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 15px 35px;
|
|
|
+ .user-item {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ gap: 7px;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|