进一步开发在线课程管理系统的功能,包括学生查看课程、提交作业、查看成绩等。

devtools/2024/10/22 2:20:56/
htmledit_views">

1. 学生查看课程功能

学生需要一个页面来查看他们已经注册的课程列表。我们可以在html" title=数据库>数据库中创建一个关联表 enrollments,用于记录学生注册的课程。

a. 修改html" title=数据库>数据库设计

新增一张 enrollments 表,来存储学生注册的课程信息:

CREATE TABLE enrollments (id INT AUTO_INCREMENT PRIMARY KEY,student_id INT,course_id INT,enrollment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (student_id) REFERENCES users(id),FOREIGN KEY (course_id) REFERENCES courses(id)
);

b. 后端 API

为学生提供查看他们注册课程的接口:

html" title=javascript>javascript">// 获取学生的课程列表 API
app.get('/students/:id/courses', (req, res) => {const studentId = req.params.id;const sql = `SELECT courses.id, courses.name, courses.description FROM courses INNER JOIN enrollments ON courses.id = enrollments.course_idWHERE enrollments.student_id = ?`;db.query(sql, [studentId], (err, results) => {if (err) return res.status(500).send('Database error');res.send(results);});
});

c. Vue 组件:学生查看课程列表 StudentCourses.vue

html" title=javascript>javascript"><template><div><h2>My Courses</h2><ul><li v-for="course in courses" :key="course.id"><h3>{{ course.name }}</h3><p>{{ course.description }}</p></li></ul></div>
</template><script>
import axios from 'axios';export default {data() {return {courses: []};},async created() {try {const studentId = 1; // 假设当前用户是学生,id为1const response = await axios.get(`http://localhost:3000/students/${studentId}/courses`);this.courses = response.data;} catch (error) {console.error('Error fetching courses:', error);}}
};
</script>

2. 学生提交作业功能

学生需要在作业页面上传作业文件。我们将实现一个上传作业的 API,并创建前端页面让学生提交作业。

a. 后端 API:学生提交作业

我们可以使用 multer 中间件来处理文件上传:

html" title=javascript>javascript">npm install multer
html" title=javascript>javascript">const multer = require('multer');
const upload = multer({ dest: 'uploads/' }); // 指定文件上传目录// 提交作业 API
app.post('/submissions', upload.single('file'), (req, res) => {const { student_id, assignment_id } = req.body;const filePath = req.file.path; // 获取上传文件的路径const sql = 'INSERT INTO submissions (student_id, assignment_id, file_path) VALUES (?, ?, ?)';db.query(sql, [student_id, assignment_id, filePath], (err, result) => {if (err) return res.status(500).send('Database error');res.send('Assignment submitted successfully');});
});

b. Vue 组件:学生提交作业 SubmitAssignment.vue

html" title=javascript>javascript"><template><div><h2>Submit Assignment</h2><form @submit.prevent="submitAssignment" enctype="multipart/form-data"><div><label for="assignment">Assignment File:</label><input type="file" @change="handleFileUpload" /></div><button type="submit">Submit</button></form></div>
</template><script>
import axios from 'axios';export default {data() {return {file: null};},methods: {handleFileUpload(event) {this.file = event.target.files[0];},async submitAssignment() {try {const formData = new FormData();formData.append('file', this.file);formData.append('student_id', 1); // 假设当前学生 ID 为 1formData.append('assignment_id', 1); // 假设作业 ID 为 1const response = await axios.post('http://localhost:3000/submissions', formData, {headers: {'Content-Type': 'multipart/form-data'}});alert('Assignment submitted successfully!');} catch (error) {console.error('Error submitting assignment:', error);}}}
};
</script>

3. 学生查看成绩功能

学生需要一个页面查看他们提交作业的成绩。

a. 后端 API:查看学生作业成绩

html" title=javascript>javascript">// 获取学生成绩 API
app.get('/students/:id/grades', (req, res) => {const studentId = req.params.id;const sql = `SELECT assignments.title, submissions.grade FROM submissions INNER JOIN assignments ON submissions.assignment_id = assignments.idWHERE submissions.student_id = ?`;db.query(sql, [studentId], (err, results) => {if (err) return res.status(500).send('Database error');res.send(results);});
});

b. Vue 组件:查看成绩 ViewGrades.vue

html" title=javascript>javascript"><template><div><h2>My Grades</h2><ul><li v-for="grade in grades" :key="grade.title"><h3>{{ grade.title }}</h3><p>Grade: {{ grade.grade || 'Not Graded Yet' }}</p></li></ul></div>
</template><script>
import axios from 'axios';export default {data() {return {grades: []};},async created() {try {const studentId = 1; // 假设当前学生 ID 为 1const response = await axios.get(`http://localhost:3000/students/${studentId}/grades`);this.grades = response.data;} catch (error) {console.error('Error fetching grades:', error);}}
};
</script>

4. 连接功能到路由

最后,将这些功能页面添加到 Vue Router 中:

html" title=javascript>javascript">import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Register from '../components/Register.vue';
import StudentCourses from '../components/StudentCourses.vue';
import SubmitAssignment from '../components/SubmitAssignment.vue';
import ViewGrades from '../components/ViewGrades.vue';const routes = [{ path: '/', name: 'Home', component: Home },{ path: '/register', name: 'Register', component: Register },{ path: '/courses', name: 'StudentCourses', component: StudentCourses },{ path: '/submit-assignment', name: 'SubmitAssignment', component: SubmitAssignment },{ path: '/view-grades', name: 'ViewGrades', component: ViewGrades }
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes
});export default router;

5. 运行项目并测试

启动 Vue.js 和 Node.js 服务后,你可以访问以下页面测试功能:

  • http://localhost:8080/courses: 学生查看课程页面。
  • http://localhost:8080/submit-assignment: 提交作业页面。
  • http://localhost:8080/view-grades: 查看成绩页面。

这将基本完成html" title=在线课程管理系统>在线课程管理系统的核心功能。如果有特定需求或者细节要优化,我们可以继续调整!

接下来我将在练手项目专栏不定期更新以上html" title=在线课程管理系统>在线课程管理系统,如果你对这些项目感兴趣可以先收藏、点赞、关注,在评论区留言。


http://www.ppmy.cn/devtools/127706.html

相关文章

叉车安全防撞装置的作用

‌叉车安全防撞装置的核心作用在于提升叉车运行时的安全性&#xff0c;特别是在倒车或经过岔路口等驾驶员视线可能受阻的情境下&#xff0c;通过探测叉车周围的障碍物距离&#xff0c;实时为驾驶员提供必要的辅助信息&#xff0c;有效预防碰撞事故的发生。‌ 这些装置通过多种技…

商品详情数据API接口概述(json数据格式返回参考)

商品详情数据API接口是指一种编程接口&#xff08;API&#xff0c;Application Programming Interface&#xff09;&#xff0c;它允许开发者或系统以编程方式获取商品的详细信息。这些信息包括但不限于SKU的详细信息、商品图片、商品属性、价格、库存状态、用户评价等。当调用…

2024.10月14日-SpringMVC-基于注解声明式事务的属性

一、基于注解的声明式事务5个属性 1 只读 语法&#xff1a; Transactional(readOnly true) 意义&#xff1a; 对一个查询操作来说&#xff0c;如果我们把它设置成只读&#xff0c;就能够明确告诉数据库&#xff0c;这个操作不涉及写操作。这样数据库就能够针对查询操作来…

xRDP – 在 Ubuntu 18.04、20.04、22.04、22.10、23.04(脚本版本 1.4.7)上轻松安装 xRDP

最新脚本Repository | c-nergy.be 概述 到目前为止&#xff0c;您应该知道 xrdp-installer 脚本旨在简化 xRDP 在 Ubuntu 操作系统上的安装和配置后操作。xRDP 是一款在 Linux 上启用远程桌面服务的软件。这意味着 Windows 用户可以使用他们的远程桌面客户端 &#xff08;mst…

深入探讨:Java 中的值传递与引用传递,真相究竟如何?

文章目录 什么是值传递和引用传递&#xff1f;Java 中的传递机制&#xff1a;值传递的真相1. 基本类型的传递&#xff1a;值传递2. 对象类型的传递&#xff1a;也是值传递&#xff01; 引用的陷阱&#xff1a;为什么它是值传递&#xff1f;总结&#xff1a;如何更好地理解 Java…

CEEMDAN +组合预测模型(CNN-Transformer + ARIMA)

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现&#xff08;一&#xff09;EMD-CSDN博客 EMD、EEM…

repo 命令大全详解(第十一篇 repo init)

repo forall 命令用于在指定的项目上执行给定的命令&#xff0c;非常适合批量操作。 参数分类及解释 基本参数 [<project>...]: 可选&#xff0c;指定要操作的项目。如果不指定&#xff0c;则对所有项目执行命令。 示例: repo forall my_project -c "git status&q…

oracle查询数据库占用大小

查询表咋用大小 SELECTSUM(bytes)/1024/1024/1024 AS GB FROMdba_segments WHEREsegment_type TABLE;查询所有文件占用大小 SELECTROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS "Size in GB" FROMdba_data_files;查询每个表空间大小 SELECTtablespace_name,ROUN…