You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
5.9 KiB
255 lines
5.9 KiB
<template>
|
|
<!-- 表格容器 -->
|
|
<div class="table-container">
|
|
<!-- 题目数据表格 -->
|
|
<table>
|
|
<!-- 表头部分 -->
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>题干</th>
|
|
<th>题目类型</th>
|
|
<th @click="sort('errorCount')" class="sortable">
|
|
<div class="sort-header">
|
|
出错次数
|
|
<span v-if="sortField === 'errorCount'" class="sort-icon">
|
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
|
|
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
|
|
</svg>
|
|
</span>
|
|
</div>
|
|
</th>
|
|
<th @click="sort('errorRate')" class="sortable">
|
|
<div class="sort-header">
|
|
出错率
|
|
<span v-if="sortField === 'errorRate'" class="sort-icon">
|
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
|
|
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
|
|
</svg>
|
|
</span>
|
|
</div>
|
|
</th>
|
|
|
|
<th>推荐课程</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<!-- 表格主体部分 -->
|
|
<tbody>
|
|
<!-- 示例数据行 -->
|
|
<tr v-for="item in sortedItems" :key="item.id">
|
|
<td>{{ item.id }}</td>
|
|
<td>{{ item.questionText }}</td>
|
|
<td>{{ item.type }}</td>
|
|
<td>{{ item.errorCount }}</td>
|
|
<td>{{ item.errorRate }}</td>
|
|
<td>{{ item.recommendedCourse }}</td>
|
|
<td>
|
|
<button class="btn-red small">查看</button>
|
|
<button class="btn-red small">修改</button>
|
|
<button class="btn-red small">删除</button>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
export default {
|
|
name: 'QuestionTable',
|
|
data() {
|
|
return {
|
|
sortField: '', // 当前排序字段
|
|
sortDirection: 'asc', // 排序方向:asc 或 desc
|
|
items: [
|
|
{
|
|
id: 1,
|
|
questionText: '以下哪项不是股票的基本特征?',
|
|
type: '股票知识',
|
|
errorCount: 50,
|
|
errorRate: '50%',
|
|
recommendedCourse: '量能擒牛'
|
|
},
|
|
{
|
|
id: 2,
|
|
questionText: '基金的风险主要来源于?',
|
|
type: '基金知识',
|
|
errorCount: 30,
|
|
errorRate: '30%',
|
|
recommendedCourse: '基本面分析'
|
|
}
|
|
],
|
|
sortedItems: [] // 用于存储排序后的结果
|
|
}
|
|
},
|
|
// computed: {
|
|
// sortedItems() {
|
|
// if (!this.sortField) {
|
|
// // 默认按 ID 升序
|
|
// return this.items.sort((a, b) => a.id - b.id)
|
|
// }
|
|
//
|
|
// return this.items.sort((a, b) => {
|
|
// const aValue = a[this.sortField]
|
|
// const bValue = b[this.sortField]
|
|
//
|
|
// // 处理数字和字符串
|
|
// if (typeof aValue === 'number' && typeof bValue === 'number') {
|
|
// return this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue
|
|
// } else {
|
|
// const strA = String(aValue).toLowerCase()
|
|
// const strB = String(bValue).toLowerCase()
|
|
// return this.sortDirection === 'asc'
|
|
// ? strA.localeCompare(strB)
|
|
// : strB.localeCompare(strA)
|
|
// }
|
|
// })
|
|
// }
|
|
// },
|
|
watch: {
|
|
sortField: {
|
|
handler() {
|
|
this.updateSortedItems()
|
|
},
|
|
immediate: true // 初始时执行一次
|
|
},
|
|
sortDirection: {
|
|
handler() {
|
|
this.updateSortedItems()
|
|
},
|
|
immediate: true
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
updateSortedItems() {
|
|
if (!this.sortField) {
|
|
this.sortedItems = [...this.items].sort((a, b) => a.id - b.id)
|
|
return
|
|
}
|
|
|
|
const sorted = [...this.items].sort((a, b) => {
|
|
const aValue = a[this.sortField]
|
|
const bValue = b[this.sortField]
|
|
|
|
if (typeof aValue === 'number' && typeof bValue === 'number') {
|
|
return this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue
|
|
} else {
|
|
const strA = String(aValue).toLowerCase()
|
|
const strB = String(bValue).toLowerCase()
|
|
return this.sortDirection === 'asc'
|
|
? strA.localeCompare(strB)
|
|
: strB.localeCompare(strA)
|
|
}
|
|
})
|
|
|
|
this.sortedItems = sorted
|
|
},
|
|
sort(field) {
|
|
if (this.sortField === field) {
|
|
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc'
|
|
} else {
|
|
this.sortField = field
|
|
this.sortDirection = 'asc'
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
|
/* 修改操作列按钮间距 */
|
|
td:last-child {
|
|
display: flex;
|
|
gap: 16px; /* 将间距设置为16px */
|
|
}
|
|
|
|
th {
|
|
display: table-cell !important;
|
|
vertical-align: middle !important;
|
|
}
|
|
|
|
/* sort-header 样式 */
|
|
.sort-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
/* 排序图标样式 */
|
|
.sort-icon svg {
|
|
width: 12px;
|
|
height: 12px;
|
|
fill: none;
|
|
stroke: #e74c3c;
|
|
stroke-width: 2;
|
|
transition: transform 0.2s;
|
|
}
|
|
/* 表格容器样式 */
|
|
.table-container {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
margin-top: 10px;
|
|
}
|
|
|
|
/* 表格样式 */
|
|
table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
background-color: white;
|
|
}
|
|
|
|
/* 表格单元格样式 */
|
|
th,
|
|
td {
|
|
padding: 12px;
|
|
text-align: left;
|
|
border-bottom: 1px solid #ddd;
|
|
}
|
|
|
|
/* 表头样式 */
|
|
th {
|
|
background-color: #f2f2f2;
|
|
font-weight: normal;
|
|
color: #333;
|
|
cursor: pointer; /* 添加鼠标指针 */
|
|
user-select: none; /* 防止文字选中 */
|
|
}
|
|
|
|
/* 可排序列样式 */
|
|
.sortable {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
/* 排序图标样式 */
|
|
.sortable svg {
|
|
width: 12px;
|
|
height: 12px;
|
|
fill: none;
|
|
stroke: #e74c3c;
|
|
stroke-width: 2;
|
|
transition: transform 0.2s;
|
|
}
|
|
|
|
/* 悬停效果 */
|
|
th:hover {
|
|
background-color: #e0e0e0;
|
|
}
|
|
|
|
/* 表格行悬停效果 */
|
|
tr:hover {
|
|
background-color: #f9f9f9;
|
|
}
|
|
|
|
|
|
|
|
</style>
|