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 django3.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.py2. 数据库配置与模型设计在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_modeSTRICT_TRANS_TABLES, charset: utf8mb4, } } }设计学生模型student/models.pyfrom django.db import models class Student(models.Model): SEX_CHOICES [(M,男),(F,女)] sno models.CharField(学号, max_length20, primary_keyTrue) name models.CharField(姓名, max_length20) sex models.CharField(性别, max_length1, choicesSEX_CHOICES) age models.PositiveSmallIntegerField(年龄) # 成绩字段 chinese models.DecimalField(语文, max_digits5, decimal_places2) math models.DecimalField(数学, max_digits5, decimal_places2) english models.DecimalField(英语, max_digits5, decimal_places2) class Meta: db_table student verbose_name 学生信息 def __str__(self): return self.name执行数据库迁移python manage.py makemigrations python manage.py migrate3. 后端核心功能实现3.1 视图层开发创建基础视图student/views.pyfrom 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( snorequest.POST[sno], namerequest.POST[name], sexrequest.POST[sex], agerequest.POST[age], chineserequest.POST[chinese], mathrequest.POST[math], englishrequest.POST[english] ) return JsonResponse({status: success}) except Exception as e: return JsonResponse({status: error, msg: str(e)})3.2 URL路由配置配置主路由sms/urls.pyfrom django.urls import path, include urlpatterns [ path(student/, include(student.urls)), ]配置应用路由student/urls.pyfrom django.urls import path from . import views urlpatterns [ path(list/, views.student_list, namestudent_list), path(add/, views.add_student, nameadd_student), path(delete/str:sno/, views.delete_student, namedelete_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 charsetutf-8 title学生成绩管理系统/title {% load static %} link relstylesheet href{% static layui/css/layui.css %} /head body div classlayui-card div classlayui-card-header h2学生成绩列表/h2 /div div classlayui-card-body table idstudentTable lay-filterstudentTable/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 /html5. 数据导入导出功能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_row2): Student.objects.update_or_create( snorow[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_typeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet ) response[Content-Disposition] attachment; filenamestudents.xlsx return response6. 成绩可视化分析集成PyECharts实现成绩分析图表from pyecharts.charts import Bar from pyecharts import options as opts def score_analysis(request): # 获取各科平均分 subjects [语文,数学,英语] avg_scores [ Student.objects.aggregate(avgAvg(chinese))[avg], Student.objects.aggregate(avgAvg(math))[avg], Student.objects.aggregate(avgAvg(english))[avg] ] # 创建柱状图 bar ( Bar() .add_xaxis(subjects) .add_yaxis(平均分, avg_scores) .set_global_opts( title_optsopts.TitleOpts(title各科平均成绩), yaxis_optsopts.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 trueNginx配置示例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 性能优化建议数据库优化为常用查询字段添加索引使用select_related和prefetch_related减少查询次数缓存策略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异步任务 使用Celery处理耗时操作如大数据量导出8. 常见问题解决方案MySQL连接问题确保已安装mysqlclient或pymysql在__init__.py中添加import pymysql pymysql.install_as_MySQLdb()LayUI表格不显示数据检查接口返回数据格式是否符合LayUI要求确保返回的JSON中包含code:0和data字段跨域问题 安装django-cors-headers并配置INSTALLED_APPS [ ... corsheaders, ] MIDDLEWARE [ corsheaders.middleware.CorsMiddleware, ... ] CORS_ORIGIN_ALLOW_ALL True文件上传大小限制 在settings.py中调整DATA_UPLOAD_MAX_MEMORY_SIZE 10485760 # 10MB FILE_UPLOAD_MAX_MEMORY_SIZE 10485760这个学生成绩管理系统虽然基础但涵盖了Web开发的完整流程。在实际项目中你可以根据需求继续扩展功能比如添加教师管理、课程管理、权限控制等模块。