Files
school-developer/src/views/stuwork/assessmentpoint/index.vue
吴红兵 b997b3ba48 fix
2026-03-07 12:35:45 +08:00

231 lines
7.9 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="modern-page-container">
<div class="page-wrapper">
<!-- 搜索表单卡片 -->
<el-card v-show="showSearch" class="search-card" shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">
<el-icon class="title-icon"><Search /></el-icon>
筛选条件
</span>
</div>
</template>
<el-form :model="state.queryForm" ref="searchFormRef" :inline="true" @keyup.enter="getDataList" class="search-form">
<el-form-item label="考核项" prop="categortyId">
<el-select v-model="state.queryForm.categortyId" placeholder="请选择考核项" clearable filterable style="width: 200px">
<el-option v-for="item in categoryList" :key="item.id" :label="item.category" :value="item.id"> </el-option>
</el-select>
</el-form-item>
<el-form-item label="指标名称" prop="pointName">
<el-input v-model="state.queryForm.pointName" placeholder="请输入指标名称" clearable style="width: 200px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button icon="Refresh" @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 内容卡片 -->
<el-card class="content-card" shadow="never">
<template #header>
<div class="card-header">
<span class="card-title">
<el-icon class="title-icon"><Document /></el-icon>
考核指标列表
</span>
<div class="header-actions">
<el-button icon="Plus" type="primary" @click="formDialogRef.openDialog()"> 新增 </el-button>
<right-toolbar v-model:showSearch="showSearch" class="ml10" @queryTable="getDataList">
<TableColumnControl
ref="columnControlRef"
:columns="tableColumns"
v-model="visibleColumns"
trigger-type="default"
trigger-circle
@change="handleColumnChange"
@order-change="handleColumnOrderChange"
>
<template #trigger>
<el-tooltip class="item" effect="dark" content="列设置" placement="top">
<el-button circle style="margin-left: 0">
<el-icon><Menu /></el-icon>
</el-button>
</el-tooltip>
</template>
</TableColumnControl>
</right-toolbar>
</div>
</div>
</template>
<!-- 表格 -->
<el-table
:data="state.dataList"
v-loading="state.loading"
stripe
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
class="modern-table"
>
<el-table-column type="index" label="序号" width="70" align="center">
<template #header>
<el-icon><List /></el-icon>
</template>
<template #default="{ $index }">
{{ $index + 1 + ((state.pagination?.current || 1) - 1) * (state.pagination?.size || 10) }}
</template>
</el-table-column>
<template v-for="col in visibleColumnsSorted" :key="col.prop || col.label">
<el-table-column
v-if="checkColumnVisible(col.prop || '') && col.prop !== '操作'"
:prop="col.prop"
:label="col.label"
:width="col.width"
:min-width="col.minWidth"
:show-overflow-tooltip="col.showOverflowTooltip !== false"
:align="col.align || 'center'"
>
<template #header>
<el-icon v-if="col.icon"><component :is="col.icon" /></el-icon>
<span :style="{ marginLeft: col.icon ? '4px' : '0' }">{{ col.label }}</span>
</template>
<!-- 默认扣分值列特殊模板 -->
<template v-if="col.prop === 'score'" #default="scope">
<el-tag v-if="scope.row.score !== undefined && scope.row.score !== null" size="small" type="danger" effect="plain" round>
{{ scope.row.score }}
</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
</template>
<el-table-column label="操作" width="180" align="center" fixed="right">
<template #header>
<el-icon><Setting /></el-icon>
<span style="margin-left: 4px">操作</span>
</template>
<template #default="scope">
<el-button icon="EditPen" link type="primary" @click="handleEdit(scope.row)"> 编辑 </el-button>
<el-button icon="Delete" link type="danger" @click="handleDelete(scope.row)"> 删除 </el-button>
</template>
</el-table-column>
<template #empty>
<el-empty description="暂无数据" :image-size="120">
<el-button type="primary" icon="Plus" @click="formDialogRef.openDialog()">新增指标</el-button>
</el-empty>
</template>
</el-table>
<!-- 分页 -->
<div class="pagination-wrapper">
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
</el-card>
</div>
<!-- 新增/编辑表单弹窗 -->
<form-dialog ref="formDialogRef" @refresh="getDataList" />
</div>
</template>
<script setup lang="ts" name="AssessmentPoint">
import { reactive, ref, onMounted } from 'vue';
import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObj } from '/@/api/stuwork/assessmentpoint';
import { getList as getAssessmentCategoryList } from '/@/api/stuwork/assessmentcategory';
import { useMessage, useMessageBox } from '/@/hooks/message';
import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import FormDialog from './form.vue';
import { List, Document, Trophy, Reading, Minus, EditPen, Setting, Menu, Search } from '@element-plus/icons-vue';
import { useTableColumnControl } from '/@/hooks/tableColumn';
// 定义变量内容
const formDialogRef = ref();
const searchFormRef = ref();
const columnControlRef = ref();
const showSearch = ref(true);
const categoryList = ref<any[]>([]);
// 表格列配置
const tableColumns = [
{ prop: 'categoryName', label: '考核项', icon: Document, minWidth: 150 },
{ prop: 'pointName', label: '指标名称', icon: Trophy, minWidth: 200 },
{ prop: 'standard', label: '评分标准', icon: Reading, minWidth: 200 },
{ prop: 'score', label: '默认扣分值', icon: Minus, width: 120 },
{ prop: 'remarks', label: '备注', icon: EditPen, minWidth: 200 },
];
// 使用表格列控制 Hook
const { visibleColumns, visibleColumnsSorted, checkColumnVisible, handleColumnChange, handleColumnOrderChange } = useTableColumnControl(tableColumns);
// 表格样式
const tableStyle = {
cellStyle: { padding: '8px 0' },
headerCellStyle: { background: '#f5f7fa', color: '#606266', fontWeight: 'bold' },
};
// 配置 useTable分页接口支持 categortyId、pointName与考核项对应
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
categortyId: '',
pointName: '',
},
pageList: fetchList,
props: {
item: 'records',
totalCount: 'total',
},
createdIsNeed: true,
});
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle: _tableStyle } = useTable(state);
// 获取考核项列表与表单考核项对应接口assessmentcategory/list
const getCategoryList = async () => {
try {
const res = await getAssessmentCategoryList();
categoryList.value = res.data && Array.isArray(res.data) ? res.data : [];
} catch (err) {
categoryList.value = [];
}
};
// 重置
const handleReset = () => {
searchFormRef.value?.resetFields();
state.queryForm.categortyId = '';
state.queryForm.pointName = '';
getDataList();
};
onMounted(() => {
getCategoryList();
});
// 编辑
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 || '删除失败');
}
}
};
</script>
<style scoped lang="scss">
@import '/@/assets/styles/modern-page.scss';
</style>