news 2026/7/6 11:40:03

从零构建Django+Layui+MySQL学生成绩管理系统:实战指南与核心代码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零构建Django+Layui+MySQL学生成绩管理系统:实战指南与核心代码解析

1. 环境准备与项目初始化

在开始构建学生成绩管理系统前,我们需要准备好开发环境。这里推荐使用PyCharm作为开发工具,它提供了完善的Python和Django支持。

首先确保已安装以下组件:

  • Python 3.8+(实测3.8.10版本最稳定)
  • MySQL 5.7+(兼容性最好)
  • Django 3.2 LTS(长期支持版)

创建项目目录并初始化虚拟环境:

mkdir score_management && cd score_management python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows

安装必要依赖包:

pip install django==3.2.12 pip install pymysql pip install pyecharts pip install layui

初始化Django项目:

django-admin startproject sms cd sms python manage.py startapp student

项目目录结构应如下:

sms/ ├── student/ # 学生管理应用 ├── static/ # 静态资源 ├── templates/ # 前端模板 ├── media/ # 上传文件 ├── sms/ # 项目配置 └── manage.py

2. 数据库配置与模型设计

settings.py中配置MySQL连接:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'score_db', 'USER': 'root', 'PASSWORD': 'yourpassword', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 'charset': 'utf8mb4', } } }

设计学生模型(student/models.py):

from django.db import models class Student(models.Model): SEX_CHOICES = [('M','男'),('F','女')] sno = models.CharField('学号', max_length=20, primary_key=True) name = models.CharField('姓名', max_length=20) sex = models.CharField('性别', max_length=1, choices=SEX_CHOICES) age = models.PositiveSmallIntegerField('年龄') # 成绩字段 chinese = models.DecimalField('语文', max_digits=5, decimal_places=2) math = models.DecimalField('数学', max_digits=5, decimal_places=2) english = models.DecimalField('英语', max_digits=5, decimal_places=2) class Meta: db_table = 'student' verbose_name = '学生信息' def __str__(self): return self.name

执行数据库迁移:

python manage.py makemigrations python manage.py migrate

3. 后端核心功能实现

3.1 视图层开发

创建基础视图(student/views.py):

from django.shortcuts import render from django.http import JsonResponse from .models import Student from django.core.paginator import Paginator def student_list(request): """分页查询学生列表""" page = request.GET.get('page', 1) limit = request.GET.get('limit', 10) queryset = Student.objects.all().order_by('sno') paginator = Paginator(queryset, limit) students = paginator.get_page(page) data = { 'code': 0, 'count': paginator.count, 'data': list(students.object_list.values()) } return JsonResponse(data) def add_student(request): """添加学生记录""" if request.method == 'POST': try: Student.objects.create( sno=request.POST['sno'], name=request.POST['name'], sex=request.POST['sex'], age=request.POST['age'], chinese=request.POST['chinese'], math=request.POST['math'], english=request.POST['english'] ) return JsonResponse({'status': 'success'}) except Exception as e: return JsonResponse({'status': 'error', 'msg': str(e)})

3.2 URL路由配置

配置主路由(sms/urls.py):

from django.urls import path, include urlpatterns = [ path('student/', include('student.urls')), ]

配置应用路由(student/urls.py):

from django.urls import path from . import views urlpatterns = [ path('list/', views.student_list, name='student_list'), path('add/', views.add_student, name='add_student'), path('delete/<str:sno>/', views.delete_student, name='delete_student'), ]

4. 前端Layui集成

4.1 静态资源准备

static目录下放置Layui资源:

static/ ├── layui/ │ ├── css/ │ ├── js/ │ └── fonts/ └── custom.js

settings.py中配置静态文件:

STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

4.2 学生列表页面

创建模板文件templates/student/list.html

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>学生成绩管理系统</title> {% load static %} <link rel="stylesheet" href="{% static 'layui/css/layui.css' %}"> </head> <body> <div class="layui-card"> <div class="layui-card-header"> <h2>学生成绩列表</h2> </div> <div class="layui-card-body"> <table id="studentTable" lay-filter="studentTable"></table> </div> </div> <script src="{% static 'layui/layui.js' %}"></script> <script> layui.use(['table', 'jquery'], function(){ var table = layui.table; var $ = layui.jquery; // 初始化表格 table.render({ elem: '#studentTable', url: '/student/list/', page: true, cols: [[ {field: 'sno', title: '学号', width: 120}, {field: 'name', title: '姓名', width: 100}, {field: 'sex', title: '性别', width: 80}, {field: 'age', title: '年龄', width: 80}, {field: 'chinese', title: '语文', width: 100}, {field: 'math', title: '数学', width: 100}, {field: 'english', title: '英语', width: 100}, {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150} ]] }); }); </script> </body> </html>

5. 数据导入导出功能

5.1 Excel导入

views.py中添加导入逻辑:

import openpyxl from django.http import HttpResponse def import_excel(request): if request.method == 'POST': excel_file = request.FILES['excel'] wb = openpyxl.load_workbook(excel_file) sheet = wb.active for row in sheet.iter_rows(min_row=2): Student.objects.update_or_create( sno=row[0].value, defaults={ 'name': row[1].value, 'sex': row[2].value, 'age': row[3].value, 'chinese': row[4].value, 'math': row[5].value, 'english': row[6].value } ) return HttpResponse('导入成功')

5.2 Excel导出

使用Django的StreamingHttpResponse实现导出:

from django.http import StreamingHttpResponse import io def export_excel(request): output = io.BytesIO() wb = openpyxl.Workbook() ws = wb.active # 添加表头 headers = ['学号','姓名','性别','年龄','语文','数学','英语'] ws.append(headers) # 添加数据 for student in Student.objects.all(): ws.append([ student.sno, student.name, student.get_sex_display(), student.age, student.chinese, student.math, student.english ]) wb.save(output) output.seek(0) response = StreamingHttpResponse( output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ) response['Content-Disposition'] = 'attachment; filename=students.xlsx' return response

6. 成绩可视化分析

集成PyECharts实现成绩分析图表:

from pyecharts.charts import Bar from pyecharts import options as opts def score_analysis(request): # 获取各科平均分 subjects = ['语文','数学','英语'] avg_scores = [ Student.objects.aggregate(avg=Avg('chinese'))['avg'], Student.objects.aggregate(avg=Avg('math'))['avg'], Student.objects.aggregate(avg=Avg('english'))['avg'] ] # 创建柱状图 bar = ( Bar() .add_xaxis(subjects) .add_yaxis("平均分", avg_scores) .set_global_opts( title_opts=opts.TitleOpts(title="各科平均成绩"), yaxis_opts=opts.AxisOpts(name="分数"), ) ) return JsonResponse(bar.dump_options_with_quotes())

在前端页面中通过AJAX调用并渲染图表:

layui.use(['echarts'], function(){ var echarts = layui.echarts; var $ = layui.jquery; $.get('/student/analysis/', function(data){ var chart = echarts.init(document.getElementById('chart')); chart.setOption(JSON.parse(data)); }); });

7. 系统部署与优化

7.1 生产环境部署

推荐使用Nginx + uWSGI方案:

# uwsgi.ini [uwsgi] chdir = /path/to/your/project module = sms.wsgi:application master = true processes = 4 socket = /tmp/sms.sock chmod-socket = 666 vacuum = true

Nginx配置示例:

server { listen 80; server_name yourdomain.com; location /static/ { alias /path/to/your/project/static/; } location / { include uwsgi_params; uwsgi_pass unix:/tmp/sms.sock; } }

7.2 性能优化建议

  1. 数据库优化:

    • 为常用查询字段添加索引
    • 使用select_relatedprefetch_related减少查询次数
  2. 缓存策略:

    from django.core.cache import cache def get_students(): students = cache.get('all_students') if not students: students = list(Student.objects.all().values()) cache.set('all_students', students, 3600) return students
  3. 异步任务: 使用Celery处理耗时操作(如大数据量导出)

8. 常见问题解决方案

  1. MySQL连接问题

    • 确保已安装mysqlclientpymysql
    • __init__.py中添加:
      import pymysql pymysql.install_as_MySQLdb()
  2. LayUI表格不显示数据

    • 检查接口返回数据格式是否符合LayUI要求
    • 确保返回的JSON中包含code:0data字段
  3. 跨域问题: 安装django-cors-headers并配置:

    INSTALLED_APPS = [ ... 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ... ] CORS_ORIGIN_ALLOW_ALL = True
  4. 文件上传大小限制: 在settings.py中调整:

    DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760 # 10MB FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760

这个学生成绩管理系统虽然基础,但涵盖了Web开发的完整流程。在实际项目中,你可以根据需求继续扩展功能,比如添加教师管理、课程管理、权限控制等模块。

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

Unity游戏接入穿山甲广告SDK:从配置到上线的避坑实战

1. 穿山甲广告SDK接入前的准备工作第一次接触穿山甲广告SDK时&#xff0c;我踩了不少坑。记得当时为了赶项目进度&#xff0c;直接跳过了账号申请环节&#xff0c;结果在调试阶段浪费了整整两天时间。所以特别提醒各位开发者&#xff0c;一定要先完成这些基础配置&#xff1a;注…

作者头像 李华
网站建设 2026/7/6 11:33:55

VITA多模态语音交互系统:免唤醒可打断的工程实践

1. 项目概述&#xff1a;一个真正“听得懂人话”的多模态交互系统我第一次在实验室跑通 VITA 的 demo 时&#xff0c;下意识对着麦克风说了句“把刚才那张图里的猫放大一点”&#xff0c;没喊唤醒词、没点按钮&#xff0c;它直接停下了正在生成的上一条回复&#xff0c;调出图像…

作者头像 李华
网站建设 2026/7/6 11:32:24

从零开始掌握OpenAI Codex:环境配置、API调用与实战应用

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 这次我们来看一个关于 Codex 的完整技术栈教程。Codex 作为 OpenAI 推出的强大代码生成模型&#xff0c;其核心价值在于能将自然语言描…

作者头像 李华
网站建设 2026/7/6 11:30:48

Java面试中必问的集合类问题,这样回答更出彩

面试官问“请说说HashMap的底层实现”&#xff0c;大多数人会背出“数组链表红黑树&#xff0c;阈值8转红黑树&#xff0c;容量是2的幂”&#xff0c;然后自信满满。但如果你只说到这儿&#xff0c;面试官心里大概率已经给你画了一个“背诵型选手”的标签。真正的加分项&#x…

作者头像 李华