数据结构实验——年级学生成绩管理系统
发布日期:2021-06-21 04:14:24 浏览次数:20 分类:技术文章

本文共 28502 字,大约阅读时间需要 95 分钟。

实验需求

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

index.html

    
学生管理系统
班级管理系统
学生管理
学生列表
新增学生
班级管理
班级列表
新增班级
课程成绩管理
课程成绩列表
新增课程及成绩
学号 姓名 性别 年龄 手机号 编辑 查看成绩 删除
2019339964013 陈榆 19 13586994166

编辑信息

班级名称 班级人数上限 当前学生人数 编辑 删除
课程名称 课程分数 修改成绩 删除课程

编辑信息

index.css

html,body {
height: 100%; /* 但是 body 的100% 相对于的是 html 所以,我们要设置 html 的高度为100% */ /* 为了让下列的 left-menu 使用 calc 设置 高度,需要让父级有高度 */}body,dl,dd {
margin: 0; height: 100%;}body::after {
content: ""; display: block; clear: both;}.header {
height: 70px; line-height: 70px; background-color: #354457;}.left-menu {
width: 200px; height: calc(100% - 70px); background-color: #4d5e70; float: left;}.right-content {
float: left; width: calc(100% - 200px); height: calc(100% - 70px); background-color: #eee; position: relative; overflow: scroll; /* 数据过多或者过长,在 tbody 中 产生滚动条 */}.header .log {
padding-left: 20px; color: #b3bcc5; font-size: 14px;}.header .log span[data-id] {
cursor: pointer;}.left-menu dl {
line-height: 40px; font-size: 14px; color: #b3bcc5; display: none;}.left-menu dl dt {
padding-left: 10px;}.left-menu dl dd {
height: 40px; padding-left: 40px; cursor: pointer;}.left-menu dl dd:hover {
background-color: rgba(255, 255, 255, 0.5); color: #354457;}.left-menu dl dd.active {
background-color: #ddd; color: #354457;}.left-menu dl.show {
display: block;}div.right-content {
display: none;}div.right-content.show {
display: block;}.right-content .content {
position: absolute; width: 100%; display: none;}.right-content .content.show-content {
display: block;}.right-content .class-add {
height: 300px;}form {
width: 400px; margin: 20px auto; height: 150px; /* margin 想要居中,就要让父元素有宽度才行 */}form div {
margin: 10px 0;}form div label:not(.sex) {
width: 80px; text-align: right; display: inline-block; margin-right: 10px;}form .btn {
padding: 5px 27px;}.content.class-list table {
width: 100%; text-align: center; height: 30px; line-height: 30px; font-size: 14px;}.content.class-list thead {
background-color: #e3e8ee; color: #646987;}.content.class-list tbody {
background-color: #fff;}.content.class-list tbody .btn {
border: none; outline: none; color: #fff; padding: 5px 10px; cursor: pointer;}.class-list table .btn.edit {
background-color: #5cb85c;}.class-list table .btn.remove {
background-color: #d9534f;}.content.student-list table {
width: 100%; text-align: center; height: 30px; line-height: 30px; font-size: 14px;}.content.student-list thead {
background-color: #e3e8ee; color: #646987;}.content.student-list tbody {
background-color: #fff;}.content.student-list tbody .btn {
border: none; outline: none; color: #fff; padding: 5px 10px; cursor: pointer;}.student-list table .btn.edit {
background-color: #5cb85c;}.student-list table .btn.remove {
background-color: #d9534f;}.student-list table .btn.score {
background-color: #4f9dd9;}.content.course-list table {
width: 100%; text-align: center; height: 30px; line-height: 30px; font-size: 14px;}.content.course-list thead {
background-color: #e3e8ee; color: #646987;}.content.course-list tbody {
background-color: #fff;}.content.course-list tbody .btn {
border: none; outline: none; color: #fff; padding: 5px 10px; cursor: pointer;}.course-list table .btn.edit {
background-color: #5cb85c;}.course-list table .btn.remove {
background-color: #d9534f;}.dialog {
position: fixed; width: 100%; height: 100%; left: 0; top: 0; background-color: rgba(0, 0, 0, 0.5); display: none;}.dialog .dialog-content {
width: 500px; height: 400px; background-color: #fff; position: fixed; left: 50%; top: 50%; margin-left: -250px; margin-top: -200px;}.dialog.show {
display: block;}.dialog .dialog-content h3 {
padding-left: 30px;}

utils.js

function setLocal(key, value) {
if (typeof value === 'object' && value !== null) {
value = JSON.stringify(value); } localStorage.setItem(key, value);}function getLocal(key) {
var value = localStorage.getItem(key); if (value === null) {
return null; } if (value[0] === '[' || value[0] === '{') {
return JSON.parse(value); } return value;}

Student.js

// studentId        学号      String// studentName      姓名      String// studentSex       性别      String// studentAge       年龄      Number// studentPhone     电话      String// studentCourse    课程      Arrayfunction Student(studentId, studentName, studentSex, studentAge, studentPhone, studentCourse) {
this.studentId = studentId; this.studentName = studentName; this.studentSex = studentSex; this.studentAge = studentAge; this.studentPhone = studentPhone; this.studentCourse = studentCourse; this.courseNum = 0;}// 添加课程function insertStudentCourse(course) {
var len = this.studentCourse.length; var insertFlag = true; for (var i = 0; i < len; i++) {
if (this.studentCourse[i]['courseName'] == course['courseName']) {
alert(this.studentName + ' 学生已学课程内 已经含有 ' + course['courseName'] + ' 这门课程'); insertFlag = false; return; } } if (insertFlag) {
this.studentCourse.push({
courseName: course['courseName'], courseGrades: course['courseGrades'], courseIndex: this.courseNum }); this.courseNum++; setLocal('allClass', classList.allClass); }}// 删除课程function delStudentCourse(course) {
var isDel = confirm('确认删除课程名称为' + course['courseName'] + ' 的课程信息 以及 其成绩吗?'); if (isDel) {
var len = this.studentCourse.length; for (var i = 0; i < len; i++) {
if (this.studentCourse[i]['courseName'] == course['courseName']) {
this.studentCourse.splice(i, 1); break; } } this.courseNum = this.studentCourse.length; alert('删除成功'); for (var i = 0; i < this.courseNum; i++) {
this.studentCourse[i].courseIndex = i; } setLocal('allClass', classList.allClass); } else {
return; }}// 渲染 课程页面function renderStudentCourse() {
console.log(this); var str = '' var tBody = document.getElementById('course-tbody'); for (var i = 0; i < this.studentCourse.length; i++) {
str += ` ${
this.studentCourse[i]['courseName']} ${
this.studentCourse[i]['courseGrades']} ` } tBody.innerHTML = str;}

ClassStructure.js

// 班级List 构造函数// classID      班级名称         String// studentsNum  班级学生上限      Number// studentsList 班级学生信息      Array// classIndex   班级的索引       Numberfunction ClassStructure(classId, maxStudentsNum, nowStudentsNum, studentsList, classIndex) {
this.classId = classId; this.maxStudentsNum = maxStudentsNum; this.nowStudentsNum = nowStudentsNum; this.studentsList = studentsList ? studentsList : []; this.classIndex = classIndex;}// 添加学生function insertStudent(student) {
var insertFlag = true; if (this.maxStudentsNum == this.studentsList.length) {
alert('该班人数已达上限,请勿添加学生'); return; // return 防止产生 关系户 } this.studentsList.forEach(function (value) {
if (value.studentId == student.studentId) {
alert('学号为' + student.studentId + '的学生已存在'); insertFlag = false; } }) if (insertFlag) {
this.studentsList.push(student); this.nowStudentsNum = this.studentsList.length; }}// 删除学生function delStudent(student) {
// 弹窗判断是否删除 var isDel = confirm('确认删除学号为' + student.studentId + '的这个学生吗?'); if (isDel) {
var len = this.studentsList.length; for (var i = 0; i < len; i++) {
if (this.studentsList[i].studentId == student.studentId) {
this.studentsList.splice(i, 1); break; } } this.nowStudentsNum = this.studentsList.length; alert('删除成功'); studentsSort.call(this); } else {
return; }}// 班级成员排序(按照学号排序)function studentsSort() {
this.studentsList.sort(function (a, b) {
return a.studentId - b.studentId; }); for (var i = 0; i < this.nowStudentsNum; i++) {
this.studentsList[i].studentIndex = i; } setLocal('allClass', classList.allClass);}// 渲染班级成员列表function renderStudentsList() {
var str = '' var tBody = document.getElementById('student-tbody'); for (var i = 0; i < this.studentsList.length; i++) {
str += ` ${
this.studentsList[i]['studentId']} ${
this.studentsList[i]['studentName']} ${
this.studentsList[i]['studentSex']} ${
this.studentsList[i]['studentAge']} ${
this.studentsList[i]['studentPhone']} ` } tBody.innerHTML = str;}

index.js

// ClassList  班级链表类var classList = {
allClass: getLocal('allClass') ? getLocal('allClass') : [], insertClass: function (tempObj) {
// insertFlag 表示 能否添加这个班级 var insertFlag = true; var classObj = new ClassStructure(tempObj.classId, tempObj.studentsNum, tempObj.nowStudentsNum, tempObj.studentsList, tempObj.classIndex); this.allClass.forEach(function (value) {
if (value['classId'] == classObj['classId']) {
alert(classObj['classId'] + ' 这个班级已经存在,添加失败'); insertFlag = false; } }) if (insertFlag) {
this.allClass.push(classObj); setLocal('allClass', this.allClass); return true; } else {
return false; } }, delClass: function (calssObj) {
// 弹窗判断是否删除 var isDel = confirm('确认删除' + calssObj.classId + '这个班级吗?'); if (isDel) {
// 删除相应索引位的班级 this.allClass.splice(calssObj.classIndex, 1); } var len = this.allClass.length; classNum = len; for (var i = 0; i < len; i++) {
this.allClass[i]['classIndex'] = i; } setLocal('allClass', this.allClass); setLocal('classNum', classNum); }};// classNum 为 班级数量var classNum = getLocal('classNum') ? Number(getLocal('classNum')) : 0;// 事件绑定函数function bindEvent() {
var class_index; var student_index; var course_index; var student_list_content = document.getElementsByClassName('right-content')[0]; var class_list_content = document.getElementsByClassName('right-content')[1]; var course_list_content = document.getElementsByClassName('right-content')[2]; // 班级菜单列表点击按钮操作 var classMenuDl = document.querySelector('.left-menu > #class-menu '); changeLeftMenu(classMenuDl); // 学生菜单列表点击按钮操作 var studentMenuDl = document.querySelector('.left-menu > #student-menu'); changeLeftMenu(studentMenuDl); // 成绩菜单列表点击按钮操作 var courseMenuDl = document.querySelector('.left-menu > #course-menu'); changeLeftMenu(courseMenuDl); // 班级信息 添加按钮 点击操作 var classAddBtn = document.getElementById('addClass-form-btn'); var classAddForm = document.getElementById('class-add-form'); classAddBtn.onclick = function (e) {
// 取消点击提交按钮的默认事件 e.preventDefault(); // 获取提交表单的数据 var tempObj = getClassFormData(classAddForm); if (tempObj.classId == '') {
alert('请输入班级名称'); return; } if (!Number(tempObj.studentsNum)) {
alert('请输入正确的班级人数(数字)'); return; } if (classList.insertClass({
classId: tempObj.classId, studentsNum: Number(tempObj.studentsNum), nowStudentsNum: 0, studentsList: [], classIndex: classNum })) {
// 更新班级数目 classNum++; setLocal('classNum', classNum); // 改变 左侧菜单栏样式 以及 右侧 content 内容 以及清除 add表单 中的内容 switchPagesByAddBtn('class', classMenuDl, classAddForm); renderClassListContent(); } } // 点击 班级管理 视图页面 的 按钮 (编辑 + 删除) var classTableBody = document.getElementById('class-tbody'); classTableBody.onclick = function (e) {
if (!e.target.classList.contains('btn')) {
return false; } // 点击的是 编辑 按钮 if (e.target.classList.contains('edit')) {
class_index = e.target.dataset.index; var siblings = getSiblings(studentMenuDl); changeStyle(siblings, 'show', studentMenuDl); student_list_content.classList.add('show'); class_list_content.classList.remove('show'); renderStudentHeadLog(class_index); renderStudentsList.call(classList.allClass[class_index]); } else {
// 点击的是删除按钮 var index = e.target.dataset.index; classList.delClass(classList.allClass[index]); renderClassListContent(); } } // 学生表单 提交按钮 点击事件 var studentAddForm = document.getElementById('student-add-form'); var addStudentFormBtn = document.getElementById('addStudent-form-btn'); addStudentFormBtn.onclick = function (e) {
e.preventDefault(); var tempObj = getStudentFormData(studentAddForm); if (isValidStudentForm(tempObj)) {
var student = new Student(tempObj.studentId, tempObj.studentName, tempObj.studentSex, tempObj.studentAge, tempObj.studentPhone, []); insertStudent.call(classList.allClass[class_index], student); studentsSort.call(classList.allClass[class_index]); renderStudentsList.call(classList.allClass[class_index]); // 改变 左侧菜单栏样式 以及 右侧 content 内容 以及清除 add表单 中的内容 switchPagesByAddBtn('student', studentMenuDl, studentAddForm); } } var student_edit_dialog = document.getElementById('student-edit-dialog'); var course_edit_dialog = document.getElementById('course-edit-dialog'); // 学生表单 按钮点击事件 var studentTableBody = document.getElementById('student-tbody'); studentTableBody.onclick = function (e) {
if (!e.target.classList.contains('btn')) {
return false; } // 点击的是编辑按钮 if (e.target.classList.contains('edit')) {
student_index = e.target.dataset.id; studentDataReset(classList.allClass[class_index].studentsList[student_index]); student_edit_dialog.classList.add('show'); } else if (e.target.classList.contains('remove')) {
// 点击的是 删除 按钮 student_index = e.target.dataset.id; delStudent.call(classList.allClass[class_index], classList.allClass[class_index].studentsList[student_index]); renderStudentsList.call(classList.allClass[class_index]); } else {
// 点击的是 查看成绩 按钮 student_index = e.target.dataset.id; // console.log(classList.allClass[class_index].studentsList[student_index]); renderCourseHeadLog(class_index, student_index); var siblings = getSiblings(courseMenuDl); changeStyle(siblings, 'show', courseMenuDl); course_list_content.classList.add('show'); student_list_content.classList.remove('show'); renderStudentCourse.call(classList.allClass[class_index].studentsList[student_index]); } } // 当编辑区域展示出来的时候,我们点击编辑区域以外的内容,编辑区域消失 以及 编辑弹窗的点击按钮事件 student_edit_dialog.onclick = function (e) {
if (e.target === this) {
student_edit_dialog.classList.remove('show'); return; } // 编辑弹窗的 点击 按钮 if (e.target.classList.contains('btn')) {
e.preventDefault(); var form = document.getElementById('student-edit-form'); var editStudent = classList.allClass[class_index].studentsList[student_index]; console.log(editStudent); editStudent.studentName = form['studentName'].value; editStudent.studentAge = form['studentAge'].value; editStudent.studentSex = form['studentSex'].value == '0' ? '男' : '女'; editStudent.studentPhone = form['studentPhone'].value; renderStudentsList.call(classList.allClass[class_index]); student_edit_dialog.classList.remove('show'); setLocal('allClass', classList.allClass); } } // 课程表单提交按钮 点击事件 var addCourseFormBtn = document.getElementById('addCourse-form-btn'); var courseAddForm = document.getElementById('course-add-form'); addCourseFormBtn.onclick = function (e) {
// 阻止点击 submit 按钮 页面刷新 e.preventDefault(); if (!courseAddForm['courseGrades']) {
alert('请输入课程名称'); return; } if (courseAddForm['courseGrades'] == '' || !Number(courseAddForm['courseGrades'].value)) {
alert('请正确输入成绩'); return; } if (Number(courseAddForm['courseGrades'].value) < 0 || Number(courseAddForm['courseGrades'].value) > 100) {
alert('请输入 0 ~ 100 分的成绩'); return; } var tempObj = {
courseName: courseAddForm['courseName'].value, courseGrades: Number(courseAddForm['courseGrades'].value) }; insertStudentCourse.call(classList.allClass[class_index].studentsList[student_index], tempObj); // 改变 左侧菜单栏样式 以及 右侧 content 内容 以及清除 add表单 中的内容 switchPagesByAddBtn('course', courseMenuDl, courseAddForm); renderStudentCourse.call(classList.allClass[class_index].studentsList[student_index]); } // 成绩 列表 按钮点击事件 var courseTbody = document.getElementById('course-tbody'); courseTbody.onclick = function (e) {
if (!e.target.classList.contains('btn')) {
return; } if (e.target.classList.contains('edit')) {
// 编辑按钮 点击 course_index = e.target.dataset.id; var course_edit_form = document.getElementById('course-edit-form'); // 弹窗中的 表单回填 course_edit_form['courseName'].value = classList.allClass[class_index].studentsList[student_index].studentCourse[course_index].courseName; course_edit_form['courseGrades'].value = classList.allClass[class_index].studentsList[student_index].studentCourse[course_index].courseGrades; course_edit_dialog.classList.add('show'); } else {
// 删除按钮的点击 course_index = e.target.dataset.id; delStudentCourse.call(classList.allClass[class_index].studentsList[student_index], classList.allClass[class_index].studentsList[student_index].studentCourse[course_index]); renderStudentCourse.call(classList.allClass[class_index].studentsList[student_index]); } } // 成绩 编辑表单 点击事件 course_edit_dialog.onclick = function (e) {
if (e.target === this) {
course_edit_dialog.classList.remove('show'); return; } if (e.target.classList.contains('btn')) {
e.preventDefault(); var course_edit_form = document.getElementById('course-edit-form'); if (course_edit_form['courseGrades'].value > 100 || course_edit_form['courseGrades'].value < 0) {
alert('请输入 0 ~ 100 分的成绩'); return; } // 将编辑成绩弹窗中的 成绩 赋值给 数组中 var editCourse = classList.allClass[class_index].studentsList[student_index].studentCourse[course_index]; editCourse.courseGrades = course_edit_form['courseGrades'].value; // 重新渲染页面 renderStudentCourse.call(classList.allClass[class_index].studentsList[student_index]); course_edit_dialog.classList.remove('show'); setLocal('allClass', classList.allClass); } } // 点击 header 上 的 log 返回 上一级 var log = document.getElementsByClassName('log')[0].getElementsByTagName('span')[0]; log.onclick = function () {
var data_id = this.dataset.id; if (!data_id) {
return; } if (data_id == 'student') {
// 当前是 学生管理 页面 // 左侧菜单切换 classMenuDl.classList.add('show'); studentMenuDl.classList.remove('show'); // 右侧菜单切换 student_list_content.classList.remove('show'); class_list_content.classList.add('show'); log.innerHTML = '班级管理系统'; log.removeAttribute('data-id'); renderClassListContent(); } else {
// 当前是 课程成绩管理 页面 // 左侧菜单切换 studentMenuDl.classList.add('show'); courseMenuDl.classList.remove('show'); // 右侧菜单切换 student_list_content.classList.add('show'); course_list_content.classList.remove('show'); renderStudentHeadLog(class_index); } }}// 切换样式效果function changeStyle(siblings, className, target) {
for (var i = 0; i < siblings.length; i++) {
siblings[i].classList.remove(className); } target.classList.add(className);}// 查找兄弟元素节点function getSiblings(node) {
var children = node.parentNode.children; var result = []; for (var i = 0; i < children.length; i++) {
if (children[i] != node) {
result.push(children[i]); } } return result;}// 三个添加页面内 提交按钮 点击事件function switchPagesByAddBtn(target, menuDom, addForm) {
// traget 传入的参数是 字符串 可以为 'class' 'student' 'course' // menu 为 左侧 菜单的父级 // addForm 为 表单 // 左侧menu 更改 var list_menu = menuDom.getElementsByTagName('dd')[0]; var siblings = getSiblings(list_menu); changeStyle(siblings, 'active', list_menu); // 右侧content 更改 var list_content = document.getElementById(target + '-list'); siblings = getSiblings(list_content); changeStyle(siblings, 'show-content', list_content); addForm.getElementsByClassName('btn')[1].click();}// 改变左侧菜单样式 以及 右侧对应内容相应的样式function changeLeftMenu(dom) {
dom.onclick = function (e) {
if (e.target.tagName === 'DD') {
var siblings = getSiblings(e.target); changeStyle(siblings, 'active', e.target); var id = e.target.dataset.id; var content = document.getElementById(id); var contentSiblings = getSiblings(content); changeStyle(contentSiblings, 'show-content', content); } }}// 获取班级表单信息function getClassFormData(form) {
return {
classId: form['classId'].value, studentsNum: form['studentsNum'].value }}// 渲染班级列表的内容区域function renderClassListContent() {
var tBody = document.getElementById('class-tbody'); var str = ''; for (var i = 0; i < classNum; i++) {
str += ` ${
classList.allClass[i]['classId']} ${
classList.allClass[i]['maxStudentsNum']} ${
classList.allClass[i]['nowStudentsNum']} `; } tBody.innerHTML = str;}// 获取学生表单信息function getStudentFormData(form) {
return {
studentId: form['sId'].value, studentName: form['name'].value, studentSex: form['sex'].value == '0' ? '男' : '女', studentAge: Number(form['age'].value), studentPhone: form['phone'].value, }}// 学生添加表单的规则校验function isValidStudentForm(data) {
var errorObj = {
studentName: ["请填写学生姓名"], studentId: ["请填写学生学号", "学号由4-16位的数字组成"], studentAge: ["请填写年龄"], studentPhone: ["请填写手机号", "手机号格式不正确"], }; for (var prop in data) {
if (data.hasOwnProperty(prop)) {
// 判断当前属性是否有值, 如果没有则报出异常 if (!data[prop]) {
alert(errorObj[prop][0]); return false; } } } // 4 - 16 位的 数字,以数字开头,以数字结尾 var regSId = /^\d{4,16}$/; if (!regSId.test(data.studentId)) {
alert(errorObj.studentId[1]); return false; } return true;}// 学生编辑表单的数据回填function studentDataReset(data) {
var form = document.getElementById('student-edit-form'); // 循环学生信息,判断在表单当中是否含有输入的位置,如果有的话,修改其值 // form[name] 表示 form 结构中, name 属性的 属性 值 是 name 的 dom 结构 for (var prop in data) {
if (form[prop]) {
if (prop == 'studentSex') {
form[prop].value = data[prop] == '男' ? 0 : 1; } else {
form[prop].value = data[prop]; } } }}// 渲染学生页面 head 视图function renderStudentHeadLog(index) {
var log = document.getElementsByClassName('log')[0].getElementsByTagName('span')[0]; log.innerHTML = classList.allClass[index]['classId'] + ' 学生管理系统 (点击返回上一页面)'; log.setAttribute('data-id', 'student');}// 渲染成绩管理 head 视图function renderCourseHeadLog(class_index, student_index) {
var log = document.getElementsByClassName('log')[0].getElementsByTagName('span')[0]; log.innerHTML = classList.allClass[class_index].studentsList[student_index]['studentName'] + ' 学生成绩管理系统 (点击返回上一页面)'; log.setAttribute('data-id', 'course');}bindEvent();renderClassListContent();

转载地址:https://blog.csdn.net/leowahaha/article/details/109257590 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据结构实验——表达式二叉树( 以递归方式建立表达式的二叉树状结构,再分别输出前序 、中序及后序遍历结果,并计算表达式的结果。)
下一篇:原生JS实现——flappy bird 像素小鸟 项目总结

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年12月22日 10时29分01秒