Files
school-developer/src/views/stuwork/activityinfo/index.vue

277 lines
8.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<!-- 操作按钮 -->
<el-row>
<div class="mb8" style="width: 100%">
<el-button
icon="Plus"
type="primary"
@click="formDialogRef.openDialog()">
新增
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
class="ml10 mr20"
style="float: right;"
@queryTable="getDataList">
</right-toolbar>
</div>
</el-row>
<!-- 表格 -->
<el-table
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle">
<el-table-column type="index" label="序号" width="60" align="center">
<template #header>
<el-icon><List /></el-icon>
</template>
</el-table-column>
<el-table-column prop="activityTheme" label="活动主题" show-overflow-tooltip align="center" min-width="200">
<template #header>
<el-icon><Trophy /></el-icon>
<span style="margin-left: 4px">活动主题</span>
</template>
</el-table-column>
<el-table-column prop="remarks" label="活动说明" show-overflow-tooltip align="center" min-width="300">
<template #header>
<el-icon><Document /></el-icon>
<span style="margin-left: 4px">活动说明</span>
</template>
</el-table-column>
<el-table-column prop="maxSub" label="活动兼报数" show-overflow-tooltip align="center" width="120">
<template #header>
<el-icon><UserFilled /></el-icon>
<span style="margin-left: 4px">活动兼报数</span>
</template>
<template #default="scope">
<el-tag v-if="scope.row.maxSub" size="small" type="success" effect="plain">
{{ scope.row.maxSub }}
</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="startTime" label="开始时间" show-overflow-tooltip align="center" width="120">
<template #header>
<el-icon><Calendar /></el-icon>
<span style="margin-left: 4px">开始时间</span>
</template>
<template #default="scope">
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column prop="endTime" label="结束时间" show-overflow-tooltip align="center" width="120">
<template #header>
<el-icon><Calendar /></el-icon>
<span style="margin-left: 4px">结束时间</span>
</template>
<template #default="scope">
<span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="300" align="center" fixed="right">
<template #header>
<el-icon><Setting /></el-icon>
<span style="margin-left: 4px">操作</span>
</template>
<template #default="scope">
<el-button
icon="View"
text
type="primary"
@click="handleView(scope.row)">
查看详情
</el-button>
<el-button
icon="Upload"
text
type="success"
@click="handleImportSub(scope.row)">
导入子项目
</el-button>
<el-button
icon="Edit"
text
type="primary"
@click="handleEdit(scope.row)">
编辑
</el-button>
<el-button
icon="Delete"
text
type="danger"
@click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
v-bind="state.pagination" />
</div>
<!-- 新增/编辑表单弹窗 -->
<form-dialog ref="formDialogRef" @refresh="getDataList" />
<!-- 查看详情弹窗 -->
<detail-dialog ref="detailDialogRef" />
<!-- 导入子项目弹窗 -->
<el-dialog
title="导入子项目"
v-model="importDialogVisible"
:width="500"
:close-on-click-modal="false"
draggable>
<div style="margin-bottom: 15px;">
<el-text>活动主题{{ currentActivity?.activityTheme || '-' }}</el-text>
</div>
<el-upload
ref="uploadRef"
:auto-upload="false"
:on-change="handleFileChange"
:limit="1"
accept=".xlsx,.xls"
drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
将文件拖到此处<em>点击上传</em>
</div>
<template #tip>
<div class="el-upload__tip">
只能上传 xlsx/xls 文件
</div>
</template>
</el-upload>
<template #footer>
<span class="dialog-footer">
<el-button @click="importDialogVisible = false"> </el-button>
<el-button type="primary" @click="handleImportSubmit" :disabled="!importFile || importLoading"> </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="ActivityInfo">
import { reactive, ref } from 'vue'
import { BasicTableProps, useTable } from "/@/hooks/table";
import { fetchList, delObj, importSub } from "/@/api/stuwork/activityinfo";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { parseTime } from "/@/utils/formatTime";
import { UploadFilled, List, Trophy, Document, UserFilled, Calendar, Setting } from '@element-plus/icons-vue'
import FormDialog from './form.vue'
import DetailDialog from './detail.vue'
// 定义变量内容
const formDialogRef = ref()
const detailDialogRef = ref()
const uploadRef = ref()
const showSearch = ref(false)
const importDialogVisible = ref(false)
const importFile = ref<File | null>(null)
const importLoading = ref(false)
const currentActivity = ref<any>(null)
// 表格样式
const tableStyle = {
cellStyle: { padding: '8px 0' },
headerCellStyle: { background: '#f5f7fa', color: '#606266', fontWeight: 'bold' }
}
// 配置 useTable
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
props: {
item: 'records',
totalCount: 'total'
},
createdIsNeed: true // 页面加载时自动获取数据
})
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
tableStyle: _tableStyle
} = useTable(state)
// 查看详情
const handleView = (row: any) => {
detailDialogRef.value?.openDialog(row.id)
}
// 编辑
const handleEdit = (row: any) => {
formDialogRef.value?.openDialog('edit', row)
}
// 删除
const handleDelete = async (row: any) => {
const { confirm } = useMessageBox()
try {
await confirm('确定要删除该活动吗?')
await delObj([row.id])
useMessage().success('删除成功')
getDataList()
} catch (err: any) {
if (err !== 'cancel') {
useMessage().error(err.msg || '删除失败')
}
}
}
// 导入子项目
const handleImportSub = (row: any) => {
currentActivity.value = row
importFile.value = null
importDialogVisible.value = true
uploadRef.value?.clearFiles()
}
// 文件变化
const handleFileChange = (file: any) => {
importFile.value = file.raw
}
// 提交导入
const handleImportSubmit = async () => {
if (!importFile.value) {
useMessage().warning('请选择要上传的文件!')
return
}
if (!currentActivity.value?.id) {
useMessage().warning('活动信息不存在!')
return
}
importLoading.value = true
try {
await importSub(currentActivity.value.id, importFile.value)
useMessage().success('导入成功')
importDialogVisible.value = false
importFile.value = null
uploadRef.value?.clearFiles()
} catch (err: any) {
useMessage().error(err.msg || '导入失败')
} finally {
importLoading.value = false
}
}
</script>
<style scoped lang="scss">
</style>