news 2026/10/5 12:14:10

Python+Django+Vue 学生管理系统:从零到部署的完整设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+Django+Vue 学生管理系统:从零到部署的完整设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!

1. 项目背景与需求分析

学生管理系统是高校教务、班级管理中最常见的业务系统之一。本文将以 Python + Django + Vue 为技术栈,从需求分析、系统设计、前后端开发到部署上线,完整讲解一个学生管理系统的设计与实现过程。

系统核心目标是实现对学生信息、班级信息、课程信息、成绩信息的统一管理,支持管理员、教师、学生三类角色的差异化操作权限。

2. 技术选型与架构设计

2.1 技术栈说明

层次技术选型说明
后端框架Django 4.x提供 REST API 与 ORM 数据模型
API 方案Django REST Framework快速构建标准 RESTful 接口
前端框架Vue 3 + Vite组件化开发,配合 Element Plus 组件库
数据库MySQL 8.0存储业务数据,支持事务与索引优化
认证方案JWT基于 Token 的无状态身份认证

2.2 系统架构

系统采用前后端分离架构,前端 Vue 应用通过 Axios 调用后端 Django REST API,后端通过 JWT 完成身份校验,数据统一存储在 MySQL 中。

flowchart TD A[Vue 3 前端] -->|Axios / JWT| B[Django REST API] B --> C[ORM 模型层] C --> D[(MySQL 数据库)] B --> E[权限控制] E --> F[管理员 / 教师 / 学生]

3. 数据库设计与模型实现

3.1 核心数据表设计

系统共设计五张核心业务表:用户表、学生表、教师表、班级表、课程表、成绩表。下面给出关键字段设计。

表名核心字段说明
Userusername、password、role复用 Django 内置用户,扩展角色字段
Studentstudent_no、name、gender、class_id关联用户表与班级表
Teacherteacher_no、name、title关联用户表
Classclass_name、grade、major班级基础信息
Coursecourse_name、credit、teacher_id课程与授课教师关联
Scorestudent_id、course_id、score学生选课成绩记录

3.2 Django 模型代码

from django.db import models from django.contrib.auth.models import User class Student(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) student_no = models.CharField(max_length=20, unique=True) name = models.CharField(max_length=50) gender = models.CharField(max_length=10, choices=[('M', '男'), ('F', '女')]) class_name = models.ForeignKey('ClassInfo', on_delete=models.SET_NULL, null=True) def __str__(self): return f"{self.student_no} - {self.name}" class ClassInfo(models.Model): class_name = models.CharField(max_length=50) grade = models.CharField(max_length=20) major = models.CharField(max_length=50) class Course(models.Model): course_name = models.CharField(max_length=100) credit = models.FloatField() teacher = models.ForeignKey('Teacher', on_delete=models.SET_NULL, null=True) class Score(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE) course = models.ForeignKey(Course, on_delete=models.CASCADE) score = models.DecimalField(max_digits=5, decimal_places=2) class Meta: unique_together = ('student', 'course')

4. 后端 API 设计与实现

4.1 项目初始化

# 创建虚拟环境 python -m venv venv source venv/bin/activate 安装依赖 pip install django djangorestframework djangorestframework-simplejwt django-cors-headers 创建项目与应用 django-admin startproject student_system cd student_system python manage.py startapp students

4.2 配置 settings.py

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'corsheaders', 'students', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] CORS_ALLOW_ALL_ORIGINS = True REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), }

4.3 序列化器与视图

from rest_framework import serializers, viewsets from .models import Student, ClassInfo, Course, Score class StudentSerializer(serializers.ModelSerializer): class Meta: model = Student fields = 'all' class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer

4.4 路由配置

from django.urls import path, include from rest_framework.routers import DefaultRouter from students.views import StudentViewSet router = DefaultRouter() router.register('students', StudentViewSet) urlpatterns = [ path('api/', include(router.urls)), path('api/token/', TokenObtainPairView.as_view()), ]

5. 前端 Vue 项目搭建

5.1 创建 Vue 项目

npm create vue@latest student-web cd student-web npm install npm install axios element-plus vue-router pinia

5.2 封装 Axios 请求

import axios from 'axios' const request = axios.create({ baseURL: 'http://localhost:8000/api', timeout: 10000 }) request.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = Bearer ${token} } return config }) export default request

5.3 学生列表页面

<template> <el-table :data="students" border stripe> <el-table-column prop="student_no" label="学号" /> <el-table-column prop="name" label="姓名" /> <el-table-column prop="gender" label="性别" /> <el-table-column prop="class_name" label="班级" /> <el-table-column label="操作"> <template #default="{ row }"> <el-button type="primary" size="small" @click="editStudent(row)">编辑</el-button> <el-button type="danger" size="small" @click="deleteStudent(row)">删除</el-button> </template> </el-table-column> </el-table> </template> <script setup> import { ref, onMounted } from 'vue' import request from '../utils/request' const students = ref([]) const fetchStudents = async () => { const res = await request.get('/students/') students.value = res.data } onMounted(fetchStudents) </script>

6. 权限控制与角色管理

系统通过 JWT 中的角色字段实现权限控制。管理员可以管理全部数据,教师可以录入和查看成绩,学生只能查看自己的信息。

from rest_framework.permissions import BasePermission class IsAdminOrTeacher(BasePermission): def has_permission(self, request, view): role = getattr(request.user, 'role', None) return role in ['admin', 'teacher']

7. 系统部署与上线

7.1 后端部署

# 收集静态文件 python manage.py collectstatic 使用 Gunicorn 启动 gunicorn student_system.wsgi:application --bind 0.0.0.0:8000

7.2 前端部署

npm run build # 将 dist 目录部署到 Nginx

8. 总结

本文完整实现了基于 Python + Django + Vue 的学生管理系统,覆盖了需求分析、数据库设计、后端 API 开发、前端页面搭建、权限控制和部署上线等核心环节。读者可以在此基础上继续扩展选课管理、考勤管理、数据可视化等高级功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 12:09:06

Python调用海康机器人工业相机的正确姿势:绕过cv2.VideoCapture

1. 项目概述&#xff1a;为什么工业相机调用不能只靠cv2.VideoCapture()硬套&#xff1f;在产线视觉检测、高精度定位、飞拍抓取这些实际场景里&#xff0c;我见过太多人拿着Python和OpenCV写完几行代码就信心满满去接海康机器人相机——结果要么黑屏&#xff0c;要么卡顿&…

作者头像 李华
网站建设 2026/10/5 12:06:49

全栈安全作战平台:端口扫描与LLM红队融合实践

1. 为什么我要把端口扫描和LLM红队塞进同一个平台最早动这个念头&#xff0c;是在一次内部资产梳理之后。当时手里攒了一堆零散脚本&#xff1a;有跑端口探测的&#xff0c;有做目录爆破的&#xff0c;有调大模型接口做告警归并的&#xff0c;彼此之间靠人工复制粘贴串起来。一…

作者头像 李华
网站建设 2026/10/5 12:06:41

从线性回归理解深度学习的最小训练闭环

从李沐老师的《动手学深度学习》讲线性回归那一章里&#xff0c;我印象最深的一句话不是某个公式&#xff0c;而是“最小训练闭环”这六个字。很多人学到这里会觉得线性回归太简单了&#xff0c;一个w*x b有什么好学的&#xff1f;但恰恰是这个最简单的模型&#xff0c;把深度…

作者头像 李华
网站建设 2026/10/5 12:06:20

三次样条插值收敛性验证:MATLAB实现与误差分析

不知道你有没有遇到过这种情况&#xff1a;明明节点已经加密到了几百个&#xff0c;可算出来的插值结果和真实函数之间到底还差多少&#xff0c;心里完全没底。它是在稳定地变小&#xff0c;还是已经进入了随机波动区间&#xff1f;这就是“收敛性验证”要做的事。MATLAB 里一行…

作者头像 李华
网站建设 2026/10/5 12:06:20

DeepSeek Harness桌面端上手实战:安装配置、API Key排错与Skill内网部署

1. 从命令行到桌面窗口&#xff1a;DSH 这次到底补上了哪块短板DeepSeek Harness&#xff08;圈内一般直接叫 DSH&#xff09;最早是以命令行工具形态出现的&#xff0c;核心定位是给大模型套一层可编排的"马具"——把模型调用、工具调用、文件读写、Skill 执行这些能…

作者头像 李华
网站建设 2026/10/5 12:05:44

智能体自主迭代:四种技术路线与落地实践指南

1. 从“工具”到“学徒”&#xff1a;智能体自主迭代到底在解决什么问题过去两年我一直在做智能体相关的落地项目&#xff0c;从最早的规则引擎拼装&#xff0c;到后来接入大模型做任务编排&#xff0c;再到最近一年开始折腾让智能体自己改自己。说实话&#xff0c;“自主迭代”…

作者头像 李华