软件工程日报12
今天简单了解了vue的简单内容知识,完成了简单的学生成绩管理界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>学生成绩管理系统</title>
<style>
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<div id="app">
<h1>学生成绩管理系统</h1>
<!-- 添加学生 -->
<div>
<label for="name">姓名: </label>
<input type="text" id="name" v-model="newStudent.name" placeholder="请输入姓名">
<label for="score">分数: </label>
<input type="number" id="score" v-model="newStudent.score" placeholder="请输入分数">
<button @click="addStudent">添加</button>
</div>
<!-- 搜索功能 -->
<div>
<label for="search">搜索: </label>
<input type="text" id="search" v-model="searchKeyword" placeholder="请输入关键词">
</div>
<!-- 过滤功能 -->
<div>
<input type="checkbox" id="passOnly" v-model="showPassOnly">
<label for="passOnly">仅显示及格</label>
<label for="minScore">最低分数: </label>
<input type="number" id="minScore" v-model="minScore" placeholder="最低分数">
<label for="maxScore">最高分数: </label>
<input type="number" id="maxScore" v-model="maxScore" placeholder="最高分数">
</div>
<!-- 学生列表 -->
<table>
<thead>
<tr>
<th>姓名</th>
<th>分数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-if="filteredStudents.length === 0">
<td colspan="3">暂无学生数据</td>
</tr>
<tr v-for="(student, index) in filteredStudents" :key="index">
<td>{{ student.name }}</td>
<td :style="{ color: student.score < 60 ? 'red' : 'black' }" @dblclick="editScore(student)">
<span v-if="!student.isEditing">{{ student.score }}</span>
<input v-else v-model="student.score" @keyup.enter="saveScore(student)" @blur="saveScore(student)">
</td>
<td>
<button @click="deleteStudent(index)">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@3.2.47/dist/vue.global.js"></script>
<script>
const { createApp, ref, watch } = Vue;
const app = createApp({
setup() {
// 学生列表
const students = ref([
{ name: '张三', score: 80 },
{ name: '李四', score: 50 }
]);
// 新学生对象
const newStudent = ref({ name: '', score: 0 });
// 搜索关键词
const searchKeyword = ref('');
// 仅显示及格
const showPassOnly = ref(false);
// 分数范围过滤
const minScore = ref('');
const maxScore = ref('');
// 过滤后的学生列表
const filteredStudents = ref([]);
// 添加学生
const addStudent = () => {
if (newStudent.value.name && newStudent.value.score) {
students.value.push({ ...newStudent.value });
newStudent.value.name = '';
newStudent.value.score = 0;
}
};
// 删除学生
const deleteStudent = (index) => {
students.value.splice(index, 1);
};
// 编辑分数
const editScore = (student) => {
student.isEditing = true;
};
// 保存分数
const saveScore = (student) => {
student.isEditing = false;
};
// 计算过滤后的学生列表
const updateFilteredStudents = () => {
let filtered = students.value;
// 搜索过滤
if (searchKeyword.value) {
filtered = filtered.filter(student => student.name.includes(searchKeyword.value));
}
// 及格过滤
if (showPassOnly.value) {
filtered = filtered.filter(student => student.score >= 60);
}
// 分数范围过滤
if (minScore.value) {
filtered = filtered.filter(student => student.score >= parseInt(minScore.value));
}
if (maxScore.value) {
filtered = filtered.filter(student => student.score <= parseInt(maxScore.value));
}
filteredStudents.value = filtered;
};
// 监听数据变化,更新过滤后的学生列表
watch([students, searchKeyword, showPassOnly, minScore, maxScore], () => {
updateFilteredStudents();
});
// 初始化过滤后的学生列表
updateFilteredStudents();
return {
newStudent,
searchKeyword,
showPassOnly,
minScore,
maxScore,
filteredStudents,
addStudent,
deleteStudent,
editScore,
saveScore
};
}
});
app.mount('#app');
</script>
</body>
</html>

浙公网安备 33010602011771号