el-table-column :filters 多条件后台筛选全部数据分页处理

本文介绍如何使用 Element UI 的表格组件实现分页时筛选全部数据而非仅当前页数据的功能。通过修改前端代码和后端处理逻辑,使得筛选操作能有效应用于整个数据集。涉及前端 Vue.js 和后端数据处理技巧。

1.问题描述

最终效果如下 将排序字段传入后台进行处理
在这里插入图片描述
需要通过筛选条件 不是排序 筛选全部后台数据而不是当前页数据
查找相关资料

2.解决过程

1.首先查找相关官方文档
在这里插入图片描述
发现是筛选当前页 这样只能前端进行分页及筛选才可以实现功能 如果数据量大的情况下很麻烦

2.查找相关博客资料
主要参考 参考资料2 博客链接 element ui table+分页 筛选全部数据-demo

3.最终代码

vue页面中放上部分关键代码 有些地方需要自行进行修改

<el-table border
                              ref="multipleTable"
                              :data="gameList"
                              :row-class-name="gameRowTableClass"
                              stripe
                              tooltip-effect="dark"
                              style="width: 100%" 
                               @filter-change="filterTagTable"
                              > 
                        <el-table-column
                                label="状态"
                                align="center"
                                :filters="[{ text: '已选', value: 1  }, { text: '未选', value: 0 }]"
                                :filter-multiple="false"
                                prop="id"
                                :column-key=" 'statusFlag' "
                                show-overflow-tooltip
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if=" selectGameIds.has(scope.row.id)">已选中</el-tag>
                                <el-tag type="info" v-else>未选中</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="squareIcon"
                                label="大图标"
                                align="center"
                                :filters="[{ text: '', value: 1  }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                :column-key=" 'squareFlag' "
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.squareIcon && scope.row.squareIcon !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="bannerIcon"
                                :column-key=" 'bannerFlag' "
                                label="banner"
                                align="center"
                                :filters="[{ text: '', value: 1 }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.bannerIcon && scope.row.bannerIcon !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="microVideo"
                                :column-key=" 'videoFlag' "
                                label="视频"
                                align="center"
                                :filters="[{ text: '', value: 1 }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.microVideo && scope.row.microVideo !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
///////////////-----------------------------方法部分
filterTagTable(filters){
            // console.log("aaa:",filters,"2222")
            if(filters.statusFlag ){
              // console.log("设置statusFlag")
              //标志位
              this.queryGameSelector.statusFlag = filters.statusFlag[0]
              //设置渠道已选游戏id   这里把set展开成array
              this.queryGameSelector.selectAllGameIds =  [...this.selectGameIds];
            }else{
              // console.log("清空statusFlag")
              this.queryGameSelector.statusFlag = -1
              this.queryGameSelector.selectAllGameIds = [];
            }
            if(filters.squareFlag){
              //设置大图标标志位
              this.queryGameSelector.squareFlag = filters.squareFlag[0]
            }else{
              this.queryGameSelector.squareFlag =-1
            }
            if(filters.bannerFlag){
              //设置banner 标志位
              this.queryGameSelector.bannerFlag = filters.bannerFlag[0]
            }else{
              this.queryGameSelector.bannerFlag = -1
            }
            if(filters.videoFlag){
              //设置videoFlag
              this.queryGameSelector.videoFlag = filters.videoFlag[0]
            }else{
              this.queryGameSelector.videoFlag = -1
            }
            this.gameSelectorTemp() // 筛选所选项下的所有数据,需要调用后端接口
          },


//-------------------------------变量定义
                this.queryGameSelector={
                  "statusFlag" : -1 ,
                  "selectAllGameIds" : [],
                  "squareFlag" : -1,
                  "bannerFlag" : -1,
                  "videoFlag" : -1
                },

后台部分
接入进来参数可以通过sql语句进行查询
我这里业务比较麻烦就没采用这个
是通过stream流处理进行filter过滤的 这里就放一些代码 如果有好的建议欢迎交流

 List<GameSelectorSample> filterLists = gameSelectorSamples.stream().filter(gameSelectorSample -> {
            //判断筛选条件
            //1.判断是否为板块已选中游戏
            boolean judge1 = true;
            if (Objects.nonNull(search.getStatusFlag())) {
                if (!CollectionUtils.isEmpty(search.getSelectAllGameIds())) {
                    if (search.getStatusFlag() == 0) {
                        //这里 set非空 如果status=0 需要筛选不在set中的数据
                        judge1 = !search.getSelectAllGameIds().contains(gameSelectorSample.getId());
                    } else if (search.getStatusFlag() == 1) {
                        //如果status==1 需要筛选在set中的数据
                        judge1 = search.getSelectAllGameIds().contains(gameSelectorSample.getId());
                    }
                }
            }
            //2.判断是否有大图标 1是 0否
            boolean judge2 = true;
            if (Objects.nonNull(search.getSquareFlag())) {
                if (search.getSquareFlag() == 0) {
                    // 如果status=0 需要筛选 square为null的数据
                    judge2 = Strings.isBlank(gameSelectorSample.getSquareIcon());
                } else if (search.getSquareFlag() == 1) {
                    //如果status==1 需要筛选 square为非空的数据
                    judge2 = Strings.isNotBlank(gameSelectorSample.getSquareIcon());
                }
            }
            
            return judge1 && judge2 
        }).collect(Collectors.toList());

4.参考资料

官方相关文档
element ui table+分页 筛选全部数据-demo

vue3 的前端代码 <template> <!-- 权限检查:只有 SYSADMIN 能看到页面内容 --> <div v-if="form.usepermission === 'SYSADMIN'"> <div style="width: 100%; overflow-x: auto; padding: 16px; box-sizing: border-box;"> <!-- 查询区域:添加Flex布局实现左右分布 --> <div class="search-area"> <el-form :inline="true" :model="queryParams" class="demo-form-inline"> <!-- 左侧区域:关键词、查询、重置 --> <div class="form-left"> <el-form-item label="关键词"> <el-input v-model="queryParams.keyword" placeholder="课程关键词/工号/姓名"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery" >查询</el-button> </el-form-item> <el-form-item> <el-button @click="handleReset">重置</el-button> </el-form-item> </div> <!-- 右侧区域:审核按钮、下载按钮 --> <div class="form-right"> <el-form-item> <el-button type="primary" @click="handleParticipate"> {{ isAuditMode ? '取消审核' : '参训审核' }} </el-button> </el-form-item> <el-form-item> <el-button @click="handleDownload">DOWNLOAD <i class="el-icon-download"></i></el-button> </el-form-item> </div> </el-form> </div> <!-- 当前筛选条件显示 --> <div v-if="hasActiveFilters" class="active-filters"> <span class="filters-label">当前筛选:</span> <el-tag v-for="(value, column) in filters" :key="column" closable type="primary" @close="clearFilter(column)" class="filter-tag" > {{ getColumnLabel(column) }}: {{ value }} </el-tag> <el-button type="text" @click="clearAllFilters" class="clear-all">清除所有</el-button> </div> <!-- 表格区域 --> <div class="table-area"> <el-table ref="multipleTableRef" :data="filteredTableData" border style="width: 100%" @selection-change="handleSelectionChange" :row-key="row => row.id" > <el-table-column type="selection" width="35"></el-table-column> <!-- 序号列 --> <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.id }"> <span>序号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.id }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'id', value: 'all' }" :class="{ 'dropdown-item-active': !filters.id }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="id in getUniqueValues('id')" :key="id" :command="{ column: 'id', value: id }" :class="{ 'dropdown-item-active': filters.id === id }" > {{ id }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 区分列 --> <el-table-column prop="category" label="区分" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.category }"> <span>区分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.category }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'category', value: 'all' }" :class="{ 'dropdown-item-active': !filters.category }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="category in getUniqueValues('category')" :key="category" :command="{ column: 'category', value: category }" :class="{ 'dropdown-item-active': filters.category === category }" > {{ category }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 等级列 --> <el-table-column prop="level" label="等级" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.level }"> <span>等级</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.level }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'level', value: 'all' }" :class="{ 'dropdown-item-active': !filters.level }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="level in getUniqueValues('level')" :key="level" :command="{ column: 'level', value: level }" :class="{ 'dropdown-item-active': filters.level === level }" > {{ level }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 课程名称列 --> <el-table-column prop="coursename" label="课程名称" min-width="120" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.coursename }"> <span>课程名称</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.coursename }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'coursename', value: 'all' }" :class="{ 'dropdown-item-active': !filters.coursename }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="course in getUniqueValues('coursename')" :key="course" :command="{ column: 'coursename', value: course }" :class="{ 'dropdown-item-active': filters.coursename === course }" > {{ course }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 期数列 --> <el-table-column prop="period" label="期数" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.period }"> <span>期数</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.period }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'period', value: 'all' }" :class="{ 'dropdown-item-active': !filters.period }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="period in getUniqueValues('period')" :key="period" :command="{ column: 'period', value: period }" :class="{ 'dropdown-item-active': filters.period === period }" > {{ period }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 姓名列 --> <el-table-column prop="name" label="姓名" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.name }"> <span>姓名</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.name }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'name', value: 'all' }" :class="{ 'dropdown-item-active': !filters.name }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="name in getUniqueValues('name')" :key="name" :command="{ column: 'name', value: name }" :class="{ 'dropdown-item-active': filters.name === name }" > {{ name }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 工号列 --> <el-table-column prop="employeeid" label="工号" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.employeeid }"> <span>工号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.employeeid }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'employeeid', value: 'all' }" :class="{ 'dropdown-item-active': !filters.employeeid }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="empId in getUniqueValues('employeeid')" :key="empId" :command="{ column: 'employeeid', value: empId }" :class="{ 'dropdown-item-active': filters.employeeid === empId }" > {{ empId }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Team列 --> <el-table-column prop="team" label="Team" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.team }"> <span>Team</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.team }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'team', value: 'all' }" :class="{ 'dropdown-item-active': !filters.team }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="team in getUniqueValues('team')" :key="team" :command="{ column: 'team', value: team }" :class="{ 'dropdown-item-active': filters.team === team }" > {{ team }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Group列 --> <el-table-column prop="grouptext" label="Group" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.grouptext }"> <span>Group</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.grouptext }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'grouptext', value: 'all' }" :class="{ 'dropdown-item-active': !filters.grouptext }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="group in getUniqueValues('grouptext')" :key="group" :command="{ column: 'grouptext', value: group }" :class="{ 'dropdown-item-active': filters.grouptext === group }" > {{ group }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Part列 --> <el-table-column prop="department" label="Part" min-width="110" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.department }"> <span>Part</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.department }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'department', value: 'all' }" :class="{ 'dropdown-item-active': !filters.department }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="dept in getUniqueValues('department')" :key="dept" :command="{ column: 'department', value: dept }" :class="{ 'dropdown-item-active': filters.department === dept }" > {{ dept }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 联系方式列 --> <el-table-column prop="contact" label="联系方式" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.contact }"> <span>联系方式</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.contact }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'contact', value: 'all' }" :class="{ 'dropdown-item-active': !filters.contact }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="contact in getUniqueValues('contact')" :key="contact" :command="{ column: 'contact', value: contact }" :class="{ 'dropdown-item-active': filters.contact === contact }" > {{ contact }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 参训现况列 --> <el-table-column prop="status" label="参训现况" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.status }"> <span>参训现况</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.status }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropflow-item :command="{ column: 'status', value: 'all' }" :class="{ 'dropdown-item-active': !filters.status }" > 全部 </el-dropflow-item> <el-dropdown-item v-for="status in getUniqueValues('status')" :key="status" :command="{ column: 'status', value: status }" :class="{ 'dropdown-item-active': filters.status === status }" > {{ status }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> <template #default="scope"> <el-select v-model="scope.row.status" placeholder="请选择" @change="handleStatusChange(scope.row)"> <el-option label="参加" value="参加"></el-option> <el-option label="未参加" value="未参加"></el-option> </el-select> </template> </el-table-column> <!-- 考试得分 --> <el-table-column prop="score" label="考试得分" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.score }"> <span>考试得分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.score }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'score', value: 'all' }" :class="{ 'dropdown-item-active': !filters.score }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="score in getUniqueValues('score')" :key="score" :command="{ column: 'score', value: score }" :class="{ 'dropdown-item-active': filters.score === score }" > {{ score }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 审核状态列 --> <el-table-column prop="auditstatus" label="审核状态" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.auditstatus }"> <span>审核状态</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.auditstatus }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'auditstatus', value: 'all' }" :class="{ 'dropdown-item-active': !filters.auditstatus }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="auditStatus in getUniqueValues('auditstatus')" :key="auditStatus" :command="{ column: 'auditstatus', value: auditStatus }" :class="{ 'dropdown-item-active': filters.auditstatus === auditStatus }" > {{ auditStatus }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> </el-table> <!-- 审核操作按钮:仅isAuditMode为true时显示 --> <div v-if="isAuditMode" class="action-buttons" style="margin: 10px 0;"> <el-button type="primary" @click="handleApprove">审核通过</el-button> <el-button type="danger" @click="handleReject">审核不通过</el-button> </div> <div class="pagination"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50]" :page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="filteredTotal"> </el-pagination> </div> </div> </div> </div> <!-- 无权限时的提示 --> <div v-else class="permission-denied"> <el-result icon="warning" title="权限不足" sub-title="您没有访问此页面的权限,请联系管理员。" > <template #extra> <el-button type="primary" @click="handleGoBack">返回</el-button> <el-button @click="handleContactAdmin">联系管理员</el-button> </template> </el-result> </div> </template> <script setup> import { ref, reactive, onMounted, computed } from 'vue' import { useRouter } from 'vue-router' import axios from 'axios' import { ElMessage, ElMessageBox } from 'element-plus' import { Filter } from '@element-plus/icons-vue' import { useUserStore } from '@/stores/auth' const router = useRouter() const userStore = useUserStore() // 用户权限信息 const form = ref({ usepermission: userStore.permission || '' }) console.log('我的权限:', form.value.usepermission) // 查询参数 const queryParams = reactive({ keyword: '', pageNum: 1, pageSize: 10 }) // 表格数据 const tableData = ref([]) // 筛选条件 const filters = reactive({}) // 总条数 const total = ref(0) // 选中数据 const multipleSelection = ref([]) // 表格引用 const multipleTableRef = ref(null) // 核心状态变量:仅通过"参训审核/取消审核"按钮修改 const isAuditMode = ref(false) // 列名映射 const columnLabels = { id: '序号', category: '区分', level: '等级', coursename: '课程名称', period: '期数', name: '姓名', employeeid: '工号', team: 'Team', grouptext: 'Group', department: 'Part', contact: '联系方式', status: '参训现况', score:'考试得分', auditstatus: '审核状态' } // 获取列标签 const getColumnLabel = (column) => { return columnLabels[column] || column } // 检查是否有活跃的筛选条件 const hasActiveFilters = computed(() => { return Object.keys(filters).length > 0 }) // 获取唯一值列表 const getUniqueValues = (column) => { const values = tableData.value.map(item => item[column]).filter(Boolean) return [...new Set(values)] } // 处理筛选 const handleFilter = (command) => { const { column, value } = command if (value === 'all') { // 删除该列的筛选条件 delete filters[column] } else { // 设置筛选条件 filters[column] = value } // 重置到第一页 queryParams.pageNum = 1 } // 清除单个筛选条件 const clearFilter = (column) => { delete filters[column] } // 清除所有筛选条件 const clearAllFilters = () => { Object.keys(filters).forEach(key => { delete filters[key] }) } // 筛选后的数据 const filteredTableData = computed(() => { let filtered = tableData.value // 应用所有筛选条件 Object.keys(filters).forEach(column => { filtered = filtered.filter(item => item[column] === filters[column]) }) return filtered }) // 筛选后的总条数 const filteredTotal = computed(() => filteredTableData.value.length) // 获取表格数据 const fetchData = async () => { // 如果没有权限,不执行数据获取 if (form.value.usepermission !== 'SYSADMIN') { return } try { const res = await axios.get('/api/training/list', { params: queryParams }) // 处理数据:接口返回的status为空时,默认设为"未参加" const formattedData = res.data.data.records.map(record => ({ ...record, status: record.status ?? '未参加' })) tableData.value = formattedData total.value = res.data.total // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) } catch (error) { console.error(error) ElMessage.error('获取数据失败') } } // 查询按钮点击事件 const handleQuery = () => { queryParams.pageNum = 1 fetchData() } // 重置按钮点击事件 const handleReset = () => { queryParams.keyword = '' queryParams.pageNum = 1 // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) fetchData() } // 多选框选中数据 const handleSelectionChange = (selection) => { multipleSelection.value = selection } // 分页大小变化 const handleSizeChange = (val) => { queryParams.pageSize = val fetchData() } // 当前页变化 const handleCurrentChange = (val) => { queryParams.pageNum = val fetchData() } // 参训审核/取消审核按钮点击事件 const handleParticipate = () => { isAuditMode.value = !isAuditMode.value } // 审核通过按钮点击事件 const handleApprove = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } const hasUnparticipated = multipleSelection.value.some(row => row.status !== '参加') if (hasUnparticipated) { ElMessage.warning('未参加培训,不能通过') return } batchUpdateStatus('通过') } // 审核不通过按钮点击事件 const handleReject = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } batchUpdateStatus('不通过') } // 批量更新审核状态 const batchUpdateStatus = async (status) => { const selectedIds = multipleSelection.value.map(item => item.id) ElMessageBox.confirm(`确定要将选中记录审核为"${status}"吗?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { try { await axios.put('/api/training/batchStatus', { ids: selectedIds, status }) ElMessage.success('审核成功') fetchData() } catch (error) { console.error(error) ElMessage.error('审核失败') } }).catch(() => { // 用户取消操作 }) } // 审核状态变化(单行更新) const handleStatusChange = async (row) => { try { await axios.put(`/api/training/status/${row.id}`, { status: row.status }) ElMessage.success('更新成功') } catch (error) { console.error(error) ElMessage.error('更新失败') fetchData() } } // 下载按钮点击事件 const handleDownload = () => { window.open('/api/training/download', '_blank') } // 返回上一页 const handleGoBack = () => { router.back() } // 联系管理员 const handleContactAdmin = () => { ElMessage.info('请联系系统管理员获取权限') } // 初始化数据 onMounted(() => { // 只有 SYSADMIN 权限才获取数据 if (form.value.usepermission === 'SYSADMIN') { fetchData() } else { console.log('当前用户无权限访问此页面,权限为:', form.value.usepermission) } }) </script> <style scoped> .search-area { margin-bottom: 10px; } .demo-form-inline { display: flex; justify-content: space-between; align-items: center; width: 100%; } .form-left .el-form-item { margin-right: 10px; } .form-right .el-form-item { margin-left: 10px; } .action-buttons { text-align: left; } .pagination { margin-top: 10px; text-align: right; } /* 当前筛选条件样式 */ .active-filters { margin-bottom: 15px; padding: 10px; background-color: #f8f9fa; border-radius: 4px; border-left: 4px solid #409EFF; } .filters-label { font-weight: bold; color: #606266; margin-right: 10px; } .filter-tag { margin-right: 8px; margin-bottom: 5px; } .clear-all { margin-left: 10px; color: #409EFF; } /* 筛选头部样式 */ .filter-header { display: flex; align-items: center; justify-content: space-between; cursor: pointer; padding: 8px 0; transition: all 0.3s ease; } .filter-header.filter-active { background-color: #ecf5ff; border-radius: 4px; padding: 8px 12px; margin: -8px -12px; } .filter-header .el-icon { color: #c0c4cc; font-size: 14px; transition: all 0.3s ease; } .filter-header:hover .el-icon { color: #409EFF; } .filter-icon-active { color: #409EFF !important; } /* 下拉菜单选中项样式 */ :deep(.dropdown-item-active) { background-color: #ecf5ff !important; color: #409EFF !important; } :deep(.dropdown-item-active:hover) { background-color: #d9ecff !important; } /* 无权限提示样式 */ .permission-denied { display: flex; justify-content: center; align-items: center; height: 60vh; padding: 20px; background-color: #f5f7fa; } .permission-denied .el-result { padding: 40px 30px; } /* 表格自适应优化 */ .table-area { overflow-x: auto; } .el-table { table-layout: auto !important; /* 关键:使用自动布局 */ min-width: 100%; /* 确保表格至少与容器同宽 */ } .el-table__body { width: auto !important; } .el-table-column { min-width: 60px; /* 设置列最小宽度,防止内容过少时列过窄 */ } </style> 想要把<!-- 序号列 --> <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.id }"> <span>序号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.id }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'id', value: 'all' }" :class="{ 'dropdown-item-active': !filters.id }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="id in getUniqueValues('id')" :key="id" :command="{ column: 'id', value: id }" :class="{ 'dropdown-item-active': filters.id === id }" > {{ id }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column>里面的值变成根据行数值从1开始,请帮我生成完整的VUE3 代码
最新发布
12-05
<template> <!-- 权限检查:只有 SYSADMIN 能看到页面内容 --> <div v-if="form.usepermission === 'SYSADMIN'"> <div style="width: 100%; overflow-x: auto; padding: 16px; box-sizing: border-box;"> <!-- 查询区域:添加Flex布局实现左右分布 --> <div class="search-area"> <el-form :inline="true" :model="queryParams" class="demo-form-inline"> <!-- 左侧区域:关键词、查询、重置 --> <div class="form-left"> <el-form-item label="关键词"> <el-input v-model="queryParams.keyword" placeholder="课程关键词/工号/姓名"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery" >查询</el-button> </el-form-item> <el-form-item> <el-button @click="handleReset">重置</el-button> </el-form-item> </div> <!-- 右侧区域:审核按钮、下载按钮 --> <div class="form-right"> <el-form-item> <el-button type="primary" @click="handleParticipate"> {{ isAuditMode ? '取消审核' : '参训审核' }} </el-button> </el-form-item> <el-form-item> <el-button @click="handleDownload">DOWNLOAD <i class="el-icon-download"></i></el-button> </el-form-item> </div> </el-form> </div> <!-- 当前筛选条件显示 --> <div v-if="hasActiveFilters" class="active-filters"> <span class="filters-label">当前筛选:</span> <el-tag v-for="(value, column) in filters" :key="column" closable type="primary" @close="clearFilter(column)" class="filter-tag" > {{ getColumnLabel(column) }}: {{ value }} </el-tag> <el-button type="text" @click="clearAllFilters" class="clear-all">清除所有</el-button> </div> <!-- 表格区域 --> <div class="table-area"> <el-table ref="multipleTableRef" :data="filteredTableData" border style="width: 100%" @selection-change="handleSelectionChange" :row-key="row => row.id" > <el-table-column type="selection" width="35"></el-table-column> <!-- 序号列 <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.id }"> <span>序号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.id }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'id', value: 'all' }" :class="{ 'dropdown-item-active': !filters.id }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="id in getUniqueValues('id')" :key="id" :command="{ column: 'id', value: id }" :class="{ 'dropdown-item-active': filters.id === id }" > {{ id }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> --> <!-- 添加序号显示 --> <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #default="scope"> {{ scope.$index + 1 }} <!-- 关键修改:索引+1得到从1开始的序号 --> </template> </el-table-column> <!-- 区分列 --> <el-table-column prop="category" label="区分" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.category }"> <span>区分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.category }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'category', value: 'all' }" :class="{ 'dropdown-item-active': !filters.category }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="category in getUniqueValues('category')" :key="category" :command="{ column: 'category', value: category }" :class="{ 'dropdown-item-active': filters.category === category }" > {{ category }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 等级列 --> <el-table-column prop="level" label="等级" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.level }"> <span>等级</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.level }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'level', value: 'all' }" :class="{ 'dropdown-item-active': !filters.level }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="level in getUniqueValues('level')" :key="level" :command="{ column: 'level', value: level }" :class="{ 'dropdown-item-active': filters.level === level }" > {{ level }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 课程名称列 --> <el-table-column prop="coursename" label="课程名称" min-width="120" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.coursename }"> <span>课程名称</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.coursename }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'coursename', value: 'all' }" :class="{ 'dropdown-item-active': !filters.coursename }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="course in getUniqueValues('coursename')" :key="course" :command="{ column: 'coursename', value: course }" :class="{ 'dropdown-item-active': filters.coursename === course }" > {{ course }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 期数列 --> <el-table-column prop="period" label="期数" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.period }"> <span>期数</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.period }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'period', value: 'all' }" :class="{ 'dropdown-item-active': !filters.period }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="period in getUniqueValues('period')" :key="period" :command="{ column: 'period', value: period }" :class="{ 'dropdown-item-active': filters.period === period }" > {{ period }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 姓名列 --> <el-table-column prop="name" label="姓名" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.name }"> <span>姓名</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.name }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'name', value: 'all' }" :class="{ 'dropdown-item-active': !filters.name }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="name in getUniqueValues('name')" :key="name" :command="{ column: 'name', value: name }" :class="{ 'dropdown-item-active': filters.name === name }" > {{ name }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 工号列 --> <el-table-column prop="employeeid" label="工号" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.employeeid }"> <span>工号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.employeeid }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'employeeid', value: 'all' }" :class="{ 'dropdown-item-active': !filters.employeeid }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="empId in getUniqueValues('employeeid')" :key="empId" :command="{ column: 'employeeid', value: empId }" :class="{ 'dropdown-item-active': filters.employeeid === empId }" > {{ empId }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Team列 --> <el-table-column prop="team" label="Team" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.team }"> <span>Team</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.team }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'team', value: 'all' }" :class="{ 'dropdown-item-active': !filters.team }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="team in getUniqueValues('team')" :key="team" :command="{ column: 'team', value: team }" :class="{ 'dropdown-item-active': filters.team === team }" > {{ team }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Group列 --> <el-table-column prop="grouptext" label="Group" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.grouptext }"> <span>Group</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.grouptext }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'grouptext', value: 'all' }" :class="{ 'dropdown-item-active': !filters.grouptext }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="group in getUniqueValues('grouptext')" :key="group" :command="{ column: 'grouptext', value: group }" :class="{ 'dropdown-item-active': filters.grouptext === group }" > {{ group }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Part列 --> <el-table-column prop="department" label="Part" min-width="110" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.department }"> <span>Part</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.department }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'department', value: 'all' }" :class="{ 'dropdown-item-active': !filters.department }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="dept in getUniqueValues('department')" :key="dept" :command="{ column: 'department', value: dept }" :class="{ 'dropdown-item-active': filters.department === dept }" > {{ dept }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 联系方式列 --> <el-table-column prop="contact" label="联系方式" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.contact }"> <span>联系方式</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.contact }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'contact', value: 'all' }" :class="{ 'dropdown-item-active': !filters.contact }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="contact in getUniqueValues('contact')" :key="contact" :command="{ column: 'contact', value: contact }" :class="{ 'dropdown-item-active': filters.contact === contact }" > {{ contact }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 参训现况列 --> <el-table-column prop="status" label="参训现况" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.status }"> <span>参训现况</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.status }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropflow-item :command="{ column: 'status', value: 'all' }" :class="{ 'dropdown-item-active': !filters.status }" > 全部 </el-dropflow-item> <el-dropdown-item v-for="status in getUniqueValues('status')" :key="status" :command="{ column: 'status', value: status }" :class="{ 'dropdown-item-active': filters.status === status }" > {{ status }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> <template #default="scope"> <el-select v-model="scope.row.status" placeholder="请选择" @change="handleStatusChange(scope.row)"> <el-option label="参加" value="参加"></el-option> <el-option label="未参加" value="未参加"></el-option> </el-select> </template> </el-table-column> <!-- 考试得分 --> <el-table-column prop="score" label="考试得分" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.score }"> <span>考试得分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.score }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'score', value: 'all' }" :class="{ 'dropdown-item-active': !filters.score }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="score in getUniqueValues('score')" :key="score" :command="{ column: 'score', value: score }" :class="{ 'dropdown-item-active': filters.score === score }" > {{ score }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 审核状态列 --> <el-table-column prop="auditstatus" label="审核状态" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.auditstatus }"> <span>审核状态</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.auditstatus }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'auditstatus', value: 'all' }" :class="{ 'dropdown-item-active': !filters.auditstatus }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="auditStatus in getUniqueValues('auditstatus')" :key="auditStatus" :command="{ column: 'auditstatus', value: auditStatus }" :class="{ 'dropdown-item-active': filters.auditstatus === auditStatus }" > {{ auditStatus }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> </el-table> <!-- 审核操作按钮:仅isAuditMode为true时显示 --> <div v-if="isAuditMode" class="action-buttons" style="margin: 10px 0;"> <el-button type="primary" @click="handleApprove">审核通过</el-button> <el-button type="danger" @click="handleReject">审核不通过</el-button> </div> <div class="pagination"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50]" :page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="filteredTotal"> </el-pagination> </div> </div> </div> </div> <!-- 无权限时的提示 --> <div v-else class="permission-denied"> <el-result icon="warning" title="权限不足" sub-title="您没有访问此页面的权限,请联系管理员。" > <template #extra> <el-button type="primary" @click="handleGoBack">返回</el-button> <el-button @click="handleContactAdmin">联系管理员</el-button> </template> </el-result> </div> </template> <script setup> import { ref, reactive, onMounted, computed } from 'vue' import { useRouter } from 'vue-router' import axios from 'axios' import { ElMessage, ElMessageBox } from 'element-plus' import { Filter } from '@element-plus/icons-vue' import { useUserStore } from '@/stores/auth' const router = useRouter() const userStore = useUserStore() // 用户权限信息 const form = ref({ usepermission: userStore.permission || '' }) console.log('我的权限:', form.value.usepermission) // 查询参数 const queryParams = reactive({ keyword: '', pageNum: 1, pageSize: 10 }) // 表格数据 const tableData = ref([]) // 筛选条件 const filters = reactive({}) // 总条数 const total = ref(0) // 选中数据 const multipleSelection = ref([]) // 表格引用 const multipleTableRef = ref(null) // 核心状态变量:仅通过"参训审核/取消审核"按钮修改 const isAuditMode = ref(false) // 列名映射 const columnLabels = { id: '序号', category: '区分', level: '等级', coursename: '课程名称', period: '期数', name: '姓名', employeeid: '工号', team: 'Team', grouptext: 'Group', department: 'Part', contact: '联系方式', status: '参训现况', score:'考试得分', auditstatus: '审核状态' } // 获取列标签 const getColumnLabel = (column) => { return columnLabels[column] || column } // 检查是否有活跃的筛选条件 const hasActiveFilters = computed(() => { return Object.keys(filters).length > 0 }) // 获取唯一值列表 const getUniqueValues = (column) => { const values = tableData.value.map(item => item[column]).filter(Boolean) return [...new Set(values)] } // 处理筛选 const handleFilter = (command) => { const { column, value } = command if (value === 'all') { // 删除该列的筛选条件 delete filters[column] } else { // 设置筛选条件 filters[column] = value } // 重置到第一页 queryParams.pageNum = 1 } // 清除单个筛选条件 const clearFilter = (column) => { delete filters[column] } // 清除所有筛选条件 const clearAllFilters = () => { Object.keys(filters).forEach(key => { delete filters[key] }) } // 筛选后的数据 const filteredTableData = computed(() => { let filtered = tableData.value // 应用所有筛选条件 Object.keys(filters).forEach(column => { filtered = filtered.filter(item => item[column] === filters[column]) }) return filtered }) // 筛选后的总条数 const filteredTotal = computed(() => filteredTableData.value.length) // 获取表格数据 const fetchData = async () => { // 如果没有权限,不执行数据获取 if (form.value.usepermission !== 'SYSADMIN') { return } try { const res = await axios.get('/api/training/list', { params: queryParams }) // 处理数据:接口返回的status为空时,默认设为"未参加" const formattedData = res.data.data.records.map(record => ({ ...record, status: record.status ?? '未参加' })) tableData.value = formattedData total.value = res.data.total // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) } catch (error) { console.error(error) ElMessage.error('获取数据失败') } } // 查询按钮点击事件 const handleQuery = () => { queryParams.pageNum = 1 fetchData() } // 重置按钮点击事件 const handleReset = () => { queryParams.keyword = '' queryParams.pageNum = 1 // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) fetchData() } // 多选框选中数据 const handleSelectionChange = (selection) => { multipleSelection.value = selection } // 分页大小变化 const handleSizeChange = (val) => { queryParams.pageSize = val fetchData() } // 当前页变化 const handleCurrentChange = (val) => { queryParams.pageNum = val fetchData() } // 参训审核/取消审核按钮点击事件 const handleParticipate = () => { isAuditMode.value = !isAuditMode.value } // 审核通过按钮点击事件 const handleApprove = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } const hasUnparticipated = multipleSelection.value.some(row => row.status !== '参加') if (hasUnparticipated) { ElMessage.warning('未参加培训,不能通过') return } batchUpdateStatus('通过') } // 审核不通过按钮点击事件 const handleReject = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } batchUpdateStatus('不通过') } // 批量更新审核状态 const batchUpdateStatus = async (status) => { const selectedIds = multipleSelection.value.map(item => item.id) ElMessageBox.confirm(`确定要将选中记录审核为"${status}"吗?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { try { await axios.put('/api/training/batchStatus', { ids: selectedIds, status }) ElMessage.success('审核成功') fetchData() } catch (error) { console.error(error) ElMessage.error('审核失败') } }).catch(() => { // 用户取消操作 }) } // 审核状态变化(单行更新) const handleStatusChange = async (row) => { try { await axios.put(`/api/training/status/${row.id}`, { status: row.status }) ElMessage.success('更新成功') } catch (error) { console.error(error) ElMessage.error('更新失败') fetchData() } } // 下载按钮点击事件 const handleDownload = () => { window.open('/api/training/download', '_blank') } // 返回上一页 const handleGoBack = () => { router.back() } // 联系管理员 const handleContactAdmin = () => { ElMessage.info('请联系系统管理员获取权限') } // 初始化数据 onMounted(() => { // 只有 SYSADMIN 权限才获取数据 if (form.value.usepermission === 'SYSADMIN') { fetchData() } else { console.log('当前用户无权限访问此页面,权限为:', form.value.usepermission) } }) </script> <style scoped> .search-area { margin-bottom: 10px; } .demo-form-inline { display: flex; justify-content: space-between; align-items: center; width: 100%; } .form-left .el-form-item { margin-right: 10px; } .form-right .el-form-item { margin-left: 10px; } .action-buttons { text-align: left; } .pagination { margin-top: 10px; text-align: right; } /* 当前筛选条件样式 */ .active-filters { margin-bottom: 15px; padding: 10px; background-color: #f8f9fa; border-radius: 4px; border-left: 4px solid #409EFF; } .filters-label { font-weight: bold; color: #606266; margin-right: 10px; } .filter-tag { margin-right: 8px; margin-bottom: 5px; } .clear-all { margin-left: 10px; color: #409EFF; } /* 筛选头部样式 */ .filter-header { display: flex; align-items: center; justify-content: space-between; cursor: pointer; padding: 8px 0; transition: all 0.3s ease; } .filter-header.filter-active { background-color: #ecf5ff; border-radius: 4px; padding: 8px 12px; margin: -8px -12px; } .filter-header .el-icon { color: #c0c4cc; font-size: 14px; transition: all 0.3s ease; } .filter-header:hover .el-icon { color: #409EFF; } .filter-icon-active { color: #409EFF !important; } /* 下拉菜单选中项样式 */ :deep(.dropdown-item-active) { background-color: #ecf5ff !important; color: #409EFF !important; } :deep(.dropdown-item-active:hover) { background-color: #d9ecff !important; } /* 无权限提示样式 */ .permission-denied { display: flex; justify-content: center; align-items: center; height: 60vh; padding: 20px; background-color: #f5f7fa; } .permission-denied .el-result { padding: 40px 30px; } /* 表格自适应优化 */ .table-area { overflow-x: auto; } .el-table { table-layout: auto !important; /* 关键:使用自动布局 */ min-width: 100%; /* 确保表格至少与容器同宽 */ } .el-table__body { width: auto !important; } .el-table-column { min-width: 60px; /* 设置列最小宽度,防止内容过少时列过窄 */ } </style> 中的分页功能 <el-pagination @size-change=“handleSizeChange” @current-change=“handleCurrentChange” :current-page=“queryParams.pageNum” :page-sizes=“[10, 20, 50]” :page-size=“queryParams.pageSize” layout=“total, sizes, prev, pager, next, jumper” :total=“filteredTotal”> 不生效,能帮我完善表格的分页功能是他生效吗,请帮我在此基础上生成一个改善后的完整的vue3代码
12-05
vue3 的前端代码 <!-- 权限检查:只有 SYSADMIN 能看到页面内容 --> <div v-if="form.usepermission === 'SYSADMIN'"> <div style="width: 100%; overflow-x: auto; padding: 16px; box-sizing: border-box;"> <!-- 查询区域:添加Flex布局实现左右分布 --> <div class="search-area"> <el-form :inline="true" :model="queryParams" class="demo-form-inline"> <!-- 左侧区域:关键词、查询、重置 --> <div class="form-left"> <el-form-item label="关键词"> <el-input v-model="queryParams.keyword" placeholder="课程关键词/工号/姓名"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery" >查询</el-button> </el-form-item> <el-form-item> <el-button @click="handleReset">重置</el-button> </el-form-item> </div> <!-- 右侧区域:审核按钮、下载按钮 --> <div class="form-right"> <el-form-item> <el-button type="primary" @click="handleParticipate"> {{ isAuditMode ? '取消审核' : '参训审核' }} </el-button> </el-form-item> <el-form-item> <el-button @click="handleDownload">DOWNLOAD <i class="el-icon-download"></i></el-button> </el-form-item> </div> </el-form> </div> <!-- 当前筛选条件显示 --> <div v-if="hasActiveFilters" class="active-filters"> <span class="filters-label">当前筛选:</span> <el-tag v-for="(value, column) in filters" :key="column" closable type="primary" @close="clearFilter(column)" class="filter-tag" > {{ getColumnLabel(column) }}: {{ value }} </el-tag> <el-button type="text" @click="clearAllFilters" class="clear-all">清除所有</el-button> </div> <!-- 表格区域 --> <div class="table-area"> <el-table ref="multipleTableRef" :data="filteredTableData" border style="width: 100%" @selection-change="handleSelectionChange" :row-key="row => row.id" > <el-table-column type="selection" width="35"></el-table-column> <!-- 序号列 --> <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.id }"> <span>序号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.id }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'id', value: 'all' }" :class="{ 'dropdown-item-active': !filters.id }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="id in getUniqueValues('id')" :key="id" :command="{ column: 'id', value: id }" :class="{ 'dropdown-item-active': filters.id === id }" > {{ id }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 区分列 --> <el-table-column prop="category" label="区分" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.category }"> <span>区分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.category }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'category', value: 'all' }" :class="{ 'dropdown-item-active': !filters.category }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="category in getUniqueValues('category')" :key="category" :command="{ column: 'category', value: category }" :class="{ 'dropdown-item-active': filters.category === category }" > {{ category }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 等级列 --> <el-table-column prop="level" label="等级" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.level }"> <span>等级</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.level }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'level', value: 'all' }" :class="{ 'dropdown-item-active': !filters.level }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="level in getUniqueValues('level')" :key="level" :command="{ column: 'level', value: level }" :class="{ 'dropdown-item-active': filters.level === level }" > {{ level }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 课程名称列 --> <el-table-column prop="coursename" label="课程名称" min-width="120" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.coursename }"> <span>课程名称</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.coursename }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'coursename', value: 'all' }" :class="{ 'dropdown-item-active': !filters.coursename }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="course in getUniqueValues('coursename')" :key="course" :command="{ column: 'coursename', value: course }" :class="{ 'dropdown-item-active': filters.coursename === course }" > {{ course }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 期数列 --> <el-table-column prop="period" label="期数" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.period }"> <span>期数</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.period }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'period', value: 'all' }" :class="{ 'dropdown-item-active': !filters.period }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="period in getUniqueValues('period')" :key="period" :command="{ column: 'period', value: period }" :class="{ 'dropdown-item-active': filters.period === period }" > {{ period }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 姓名列 --> <el-table-column prop="name" label="姓名" min-width="60" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.name }"> <span>姓名</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.name }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'name', value: 'all' }" :class="{ 'dropdown-item-active': !filters.name }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="name in getUniqueValues('name')" :key="name" :command="{ column: 'name', value: name }" :class="{ 'dropdown-item-active': filters.name === name }" > {{ name }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 工号列 --> <el-table-column prop="employeeid" label="工号" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.employeeid }"> <span>工号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.employeeid }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'employeeid', value: 'all' }" :class="{ 'dropdown-item-active': !filters.employeeid }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="empId in getUniqueValues('employeeid')" :key="empId" :command="{ column: 'employeeid', value: empId }" :class="{ 'dropdown-item-active': filters.employeeid === empId }" > {{ empId }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Team列 --> <el-table-column prop="team" label="Team" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.team }"> <span>Team</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.team }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'team', value: 'all' }" :class="{ 'dropdown-item-active': !filters.team }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="team in getUniqueValues('team')" :key="team" :command="{ column: 'team', value: team }" :class="{ 'dropdown-item-active': filters.team === team }" > {{ team }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Group列 --> <el-table-column prop="grouptext" label="Group" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.grouptext }"> <span>Group</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.grouptext }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'grouptext', value: 'all' }" :class="{ 'dropdown-item-active': !filters.grouptext }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="group in getUniqueValues('grouptext')" :key="group" :command="{ column: 'grouptext', value: group }" :class="{ 'dropdown-item-active': filters.grouptext === group }" > {{ group }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- Part列 --> <el-table-column prop="department" label="Part" min-width="110" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.department }"> <span>Part</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.department }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'department', value: 'all' }" :class="{ 'dropdown-item-active': !filters.department }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="dept in getUniqueValues('department')" :key="dept" :command="{ column: 'department', value: dept }" :class="{ 'dropdown-item-active': filters.department === dept }" > {{ dept }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 联系方式列 --> <el-table-column prop="contact" label="联系方式" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.contact }"> <span>联系方式</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.contact }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'contact', value: 'all' }" :class="{ 'dropdown-item-active': !filters.contact }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="contact in getUniqueValues('contact')" :key="contact" :command="{ column: 'contact', value: contact }" :class="{ 'dropdown-item-active': filters.contact === contact }" > {{ contact }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 参训现况列 --> <el-table-column prop="status" label="参训现况" min-width="100" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.status }"> <span>参训现况</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.status }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropflow-item :command="{ column: 'status', value: 'all' }" :class="{ 'dropdown-item-active': !filters.status }" > 全部 </el-dropflow-item> <el-dropdown-item v-for="status in getUniqueValues('status')" :key="status" :command="{ column: 'status', value: status }" :class="{ 'dropdown-item-active': filters.status === status }" > {{ status }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> <template #default="scope"> <el-select v-model="scope.row.status" placeholder="请选择" @change="handleStatusChange(scope.row)"> <el-option label="参加" value="参加"></el-option> <el-option label="未参加" value="未参加"></el-option> </el-select> </template> </el-table-column> <!-- 考试得分 --> <el-table-column prop="score" label="考试得分" min-width="70" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.score }"> <span>考试得分</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.score }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'score', value: 'all' }" :class="{ 'dropdown-item-active': !filters.score }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="score in getUniqueValues('score')" :key="score" :command="{ column: 'score', value: score }" :class="{ 'dropdown-item-active': filters.score === score }" > {{ score }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> <!-- 审核状态列 --> <el-table-column prop="auditstatus" label="审核状态" min-width="80" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.auditstatus }"> <span>审核状态</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.auditstatus }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'auditstatus', value: 'all' }" :class="{ 'dropdown-item-active': !filters.auditstatus }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="auditStatus in getUniqueValues('auditstatus')" :key="auditStatus" :command="{ column: 'auditstatus', value: auditStatus }" :class="{ 'dropdown-item-active': filters.auditstatus === auditStatus }" > {{ auditStatus }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> </el-table> <!-- 审核操作按钮:仅isAuditMode为true时显示 --> <div v-if="isAuditMode" class="action-buttons" style="margin: 10px 0;"> <el-button type="primary" @click="handleApprove">审核通过</el-button> <el-button type="danger" @click="handleReject">审核不通过</el-button> </div> <div class="pagination"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50]" :page-size="queryParams.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="filteredTotal"> </el-pagination> </div> </div> </div> </div> <!-- 无权限时的提示 --> <div v-else class="permission-denied"> <el-result icon="warning" title="权限不足" sub-title="您没有访问此页面的权限,请联系管理员。" > <template #extra> <el-button type="primary" @click="handleGoBack">返回</el-button> <el-button @click="handleContactAdmin">联系管理员</el-button> </template> </el-result> </div> </template> <script setup> import { ref, reactive, onMounted, computed } from 'vue' import { useRouter } from 'vue-router' import axios from 'axios' import { ElMessage, ElMessageBox } from 'element-plus' import { Filter } from '@element-plus/icons-vue' import { useUserStore } from '@/stores/auth' const router = useRouter() const userStore = useUserStore() // 用户权限信息 const form = ref({ usepermission: userStore.permission || '' }) console.log('我的权限:', form.value.usepermission) // 查询参数 const queryParams = reactive({ keyword: '', pageNum: 1, pageSize: 10 }) // 表格数据 const tableData = ref([]) // 筛选条件 const filters = reactive({}) // 总条数 const total = ref(0) // 选中数据 const multipleSelection = ref([]) // 表格引用 const multipleTableRef = ref(null) // 核心状态变量:仅通过"参训审核/取消审核"按钮修改 const isAuditMode = ref(false) // 列名映射 const columnLabels = { id: '序号', category: '区分', level: '等级', coursename: '课程名称', period: '期数', name: '姓名', employeeid: '工号', team: 'Team', grouptext: 'Group', department: 'Part', contact: '联系方式', status: '参训现况', score:'考试得分', auditstatus: '审核状态' } // 获取列标签 const getColumnLabel = (column) => { return columnLabels[column] || column } // 检查是否有活跃的筛选条件 const hasActiveFilters = computed(() => { return Object.keys(filters).length > 0 }) // 获取唯一值列表 const getUniqueValues = (column) => { const values = tableData.value.map(item => item[column]).filter(Boolean) return [...new Set(values)] } // 处理筛选 const handleFilter = (command) => { const { column, value } = command if (value === 'all') { // 删除该列的筛选条件 delete filters[column] } else { // 设置筛选条件 filters[column] = value } // 重置到第一页 queryParams.pageNum = 1 } // 清除单个筛选条件 const clearFilter = (column) => { delete filters[column] } // 清除所有筛选条件 const clearAllFilters = () => { Object.keys(filters).forEach(key => { delete filters[key] }) } // 筛选后的数据 const filteredTableData = computed(() => { let filtered = tableData.value // 应用所有筛选条件 Object.keys(filters).forEach(column => { filtered = filtered.filter(item => item[column] === filters[column]) }) return filtered }) // 筛选后的总条数 const filteredTotal = computed(() => filteredTableData.value.length) // 获取表格数据 const fetchData = async () => { // 如果没有权限,不执行数据获取 if (form.value.usepermission !== 'SYSADMIN') { return } try { const res = await axios.get('/api/training/list', { params: queryParams }) // 处理数据:接口返回的status为空时,默认设为"未参加" const formattedData = res.data.data.records.map(record => ({ ...record, status: record.status ?? '未参加' })) tableData.value = formattedData total.value = res.data.total // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) } catch (error) { console.error(error) ElMessage.error('获取数据失败') } } // 查询按钮点击事件 const handleQuery = () => { queryParams.pageNum = 1 fetchData() } // 重置按钮点击事件 const handleReset = () => { queryParams.keyword = '' queryParams.pageNum = 1 // 重置筛选条件 Object.keys(filters).forEach(key => delete filters[key]) fetchData() } // 多选框选中数据 const handleSelectionChange = (selection) => { multipleSelection.value = selection } // 分页大小变化 const handleSizeChange = (val) => { queryParams.pageSize = val fetchData() } // 当前页变化 const handleCurrentChange = (val) => { queryParams.pageNum = val fetchData() } // 参训审核/取消审核按钮点击事件 const handleParticipate = () => { isAuditMode.value = !isAuditMode.value } // 审核通过按钮点击事件 const handleApprove = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } const hasUnparticipated = multipleSelection.value.some(row => row.status !== '参加') if (hasUnparticipated) { ElMessage.warning('未参加培训,不能通过') return } batchUpdateStatus('通过') } // 审核不通过按钮点击事件 const handleReject = () => { if (multipleSelection.value.length === 0) { ElMessage.warning('请先选择需要审核的记录') return } batchUpdateStatus('不通过') } // 批量更新审核状态 const batchUpdateStatus = async (status) => { const selectedIds = multipleSelection.value.map(item => item.id) ElMessageBox.confirm(`确定要将选中记录审核为"${status}"吗?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(async () => { try { await axios.put('/api/training/batchStatus', { ids: selectedIds, status }) ElMessage.success('审核成功') fetchData() } catch (error) { console.error(error) ElMessage.error('审核失败') } }).catch(() => { // 用户取消操作 }) } // 审核状态变化(单行更新) const handleStatusChange = async (row) => { try { await axios.put(`/api/training/status/${row.id}`, { status: row.status }) ElMessage.success('更新成功') } catch (error) { console.error(error) ElMessage.error('更新失败') fetchData() } } // 下载按钮点击事件 const handleDownload = () => { window.open('/api/training/download', '_blank') } // 返回上一页 const handleGoBack = () => { router.back() } // 联系管理员 const handleContactAdmin = () => { ElMessage.info('请联系系统管理员获取权限') } // 初始化数据 onMounted(() => { // 只有 SYSADMIN 权限才获取数据 if (form.value.usepermission === 'SYSADMIN') { fetchData() } else { console.log('当前用户无权限访问此页面,权限为:', form.value.usepermission) } }) </script> <style scoped> .search-area { margin-bottom: 10px; } .demo-form-inline { display: flex; justify-content: space-between; align-items: center; width: 100%; } .form-left .el-form-item { margin-right: 10px; } .form-right .el-form-item { margin-left: 10px; } .action-buttons { text-align: left; } .pagination { margin-top: 10px; text-align: right; } /* 当前筛选条件样式 */ .active-filters { margin-bottom: 15px; padding: 10px; background-color: #f8f9fa; border-radius: 4px; border-left: 4px solid #409EFF; } .filters-label { font-weight: bold; color: #606266; margin-right: 10px; } .filter-tag { margin-right: 8px; margin-bottom: 5px; } .clear-all { margin-left: 10px; color: #409EFF; } /* 筛选头部样式 */ .filter-header { display: flex; align-items: center; justify-content: space-between; cursor: pointer; padding: 8px 0; transition: all 0.3s ease; } .filter-header.filter-active { background-color: #ecf5ff; border-radius: 4px; padding: 8px 12px; margin: -8px -12px; } .filter-header .el-icon { color: #c0c4cc; font-size: 14px; transition: all 0.3s ease; } .filter-header:hover .el-icon { color: #409EFF; } .filter-icon-active { color: #409EFF !important; } /* 下拉菜单选中项样式 */ :deep(.dropdown-item-active) { background-color: #ecf5ff !important; color: #409EFF !important; } :deep(.dropdown-item-active:hover) { background-color: #d9ecff !important; } /* 无权限提示样式 */ .permission-denied { display: flex; justify-content: center; align-items: center; height: 60vh; padding: 20px; background-color: #f5f7fa; } .permission-denied .el-result { padding: 40px 30px; } /* 表格自适应优化 */ .table-area { overflow-x: auto; } .el-table { table-layout: auto !important; /* 关键:使用自动布局 */ min-width: 100%; /* 确保表格至少与容器同宽 */ } .el-table__body { width: auto !important; } .el-table-column { min-width: 60px; /* 设置列最小宽度,防止内容过少时列过窄 */ } </style> 想要把 序号列 <el-table-column prop="id" label="序号" min-width="50" show-overflow-tooltip> <template #header> <div class="filter-header" :class="{ 'filter-active': filters.id }"> <span>序号</span> <el-dropdown trigger="click" @command="handleFilter"> <el-icon :class="{ 'filter-icon-active': filters.id }"><Filter /></el-icon> <template #dropdown> <el-dropdown-menu> <el-dropdown-item :command="{ column: 'id', value: 'all' }" :class="{ 'dropdown-item-active': !filters.id }" > 全部 </el-dropdown-item> <el-dropdown-item v-for="id in getUniqueValues('id')" :key="id" :command="{ column: 'id', value: id }" :class="{ 'dropdown-item-active': filters.id === id }" > {{ id }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </template> </el-table-column> 里面的值变成根据行数值从1开始并且分页功能生效,请帮我生成完整的VUE3 代码
12-05
<el-table ref="singleTable" :data="configs" border class="wraper-table" element-loading-text="Loading" fit highlight-current-row size="mini" style="margin: 0px 0 20px 0"> <el-table-column :label="$t('table.select')" width="50" align="center"> <template slot-scope="scope"> <el-radio v-model="radio" :label="scope.row.id" @change="chooseOne(scope.row)">{{ '' }}</el-radio> </template> </el-table-column> <el-table-column :label="$t('table.id')" align="center" width="50"> <template v-slot="scope"> {{ initTableIndex('page', scope.$index) }} </template> </el-table-column> <el-table-column :label="$t('i18nView.pdCode')" align="center" prop="pdCode"></el-table-column> <el-table-column :label="$t('i18nView.pdName')" align="center" prop="pdName"></el-table-column> <el-table-column :label="$t('customComponents.pdEdition')" align="center" prop="pdEdition"></el-table-column> <el-table-column :label="$t('pdtempPdInfoView.pdApplDate')" align="center" prop="pdApplDate" sortable></el-table-column> <el-table-column :label="$t('pdtempPdInfoView.updateTime')" align="center" prop="changeDate" sortable> <template v-slot="scope"><span v-if="scope.row.defType!=1">{{ scope.row.changeDate }}</span></template> </el-table-column> <el-table-column :label="$t('pdtempPdInfoView.definitionType')" align="center" prop="defType"> <template v-slot="scope">{{ scope.row.defType | filterDefType }}</template> </el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList1" :label="$t('pdtempPdInfoView.attributeDefinitionState')" align="center" prop="attrDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList2" :label="$t('pdtempPdInfoView.structureDefinitionState')" align="center" prop="structDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList3" :label="$t('pdtempPdInfoView.currentPriceDefinitionState')" align="center" prop="priceDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList4" :label="$t('pdtempPdInfoView.superviseDefinitionState')" align="center" prop="superviseDefState"></el-table-column> </el-table> <!-- 分页 --> <cus-pagination ref="page" v-model="configs" :pageSize="10" :params="params" url="/pdtemp-pd-info/list"/>以上代码如何实现数据渲染
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值