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.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_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 migrate3. 后端核心功能实现
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 response6. 成绩可视化分析
集成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 = 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开发的完整流程。在实际项目中,你可以根据需求继续扩展功能,比如添加教师管理、课程管理、权限控制等模块。