ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python Django学生信息管理系统:从零到一的毕业设计与实战开发指南

2026/9/5 1:26:04 拓冰建站 浏览量
Python Django学生信息管理系统:从零到一的毕业设计与实战开发指南 简介本资源是一套完整的基于Python与Django框架开发的学生信息管理系统面向计算机专业本科生、毕业设计初学者及Web开发入门者解决课程设计、毕设选题与轻量级教务管理场景中的核心功能实现问题。压缩包共31个文件含14个Python源码涵盖models、views、admin等Django核心模块、11个HTML模板实现登录、师生/班级增删改查等完整前端页面、1个SQLite3数据库文件与1个SQL初始化脚本辅以JS交互逻辑、静态资源及README说明文档整体仅57KB结构精简、开箱即用。已有3759人学习下载资源提供可直接运行的完整项目工程包含清晰的Django应用分层结构app、templates、static、utils工具模块、基础权限控制逻辑及典型CRUD操作实现特别适合理解MVT架构落地与快速复现毕业设计原型。1. 项目概述与核心价值最近在整理硬盘翻出来一个压箱底的“老伙计”——一个基于PythonDjango开发的学生信息管理系统。这玩意儿是我当年带毕业设计时给几个学生做的参考项目后来自己又陆陆续续完善了好几版。今天把它翻出来连带着源码和当时写的设计文档一起打包分享出来。这不仅仅是一个能直接跑起来的代码包更是一个完整的、从零到一的Web应用开发实战案例。无论你是正在为计算机、软件工程相关专业的毕业设计发愁还是想找一个Django的实战项目来练手甚至是中小学校、培训机构需要一套轻量级的管理工具这个项目都能给你提供一个清晰的骨架和扎实的代码基础。学生信息管理听起来是个老生常谈的课题但要做好、做实用里面门道不少。它本质上是一个典型的CRUD增删改查应用但涉及多表关联学生、班级、课程、成绩、权限控制管理员、教师、学生不同视图、数据统计与导出等核心功能。用Django来做这件事可以说是“专业对口”。Django自带的ORM对象关系映射能让你用Python类的方式优雅地操作数据库其强大的Admin后台在开发初期能省去大量编写管理页面的时间而清晰的MVT模型-视图-模板架构则保证了代码的可维护性。这个项目源码就是沿着这条“Django最佳实践”路径走下来的你可以看到如何设计数据模型、如何编写业务逻辑视图、如何用模板渲染页面以及如何处理表单和用户会话。接下来我就把这个项目的里里外外、设计思路、关键实现以及我踩过的那些坑毫无保留地拆解给你看。2. 系统整体设计与技术选型考量2.1 需求分析与功能模块设计做任何系统第一步不是敲代码而是想清楚它要干什么。对于一个学生信息管理系统核心用户无非三类系统管理员、教师和学生。他们的需求截然不同管理员需要全局掌控。包括学院、专业、班级信息的增删改查管理所有教师和学生的账户分配权限查看全系统数据报表。教师核心工作是教学关联。需要管理自己所授课程的学生名单录入、修改和查询学生成绩查看所带班级的基本情况。学生关心自身信息。需要查看个人的基本信息、课表、考试成绩有时可能允许其修改部分个人信息如联系电话。基于此我们将系统划分为五大核心模块用户认证与权限模块处理登录、注册通常由管理员后台添加、会话管理和基于角色的权限控制。这是系统的安全大门。学生信息管理模块核心中的核心。包括学生基本档案学号、姓名、性别、身份证号、入学时间等以及其所属班级、专业等关联信息。教学资源管理模块管理课程信息、教师信息以及课程与教师、班级之间的关联关系形成“课表”。成绩管理模块这是业务逻辑的重点。需要关联学生、课程、教师记录成绩类型平时、期中、期末、总评并考虑成绩的录入、修改、审核流程。数据查询与统计模块提供多维度查询如按班级查学生、按课程查成绩并生成简单统计报表如班级平均分、成绩分布图支持数据导出为Excel或PDF。注意毕业设计项目中切忌贪大求全。与其做一个功能庞杂但每个都粗糙的系统不如把上述核心模块做深、做稳定业务流程闭环。例如成绩管理中的“审核流程”就是一个很好的深化点可以体现状态机设计思想。2.2 为什么是Python Django面对这个需求技术选型可以有很多比如Java Spring Boot、PHP Laravel甚至Node.js。我坚持选择Python Django组合基于以下几个扎实的理由首先开发效率是王道。Python语法简洁明了Django更是号称“为完美主义者准备的截止日期框架”。它内置了太多开箱即用的组件用户认证系统、Admin管理后台、ORM、表单处理、缓存框架等。对于一个毕业设计或者快速原型项目你可以在极短时间内搭建出具备基础功能的后台把主要精力放在业务逻辑和前端交互上。比如用Django Admin你几乎不用写一行前端代码就能得到一个功能强大的数据管理界面这在项目初期验证模型和填充测试数据时无比高效。其次架构清晰利于学习与维护。Django强制性地或者说友好地建议你使用MVT模式。这种清晰的分离使得代码结构一目了然models.py定义数据结构views.py处理业务逻辑templates文件夹存放HTML页面。对于学习者而言这是一种非常规范的工程教育能培养良好的编码习惯。对于后续维护无论谁来接手都能快速定位到相关代码。再者生态丰富解决问题有现成方案。Django有着极其活跃的社区和海量的第三方应用包。在这个项目中我们用到了django-crispy-forms来美化表单用django-import-export在Admin后台方便地导入导出数据用Pillow来处理学生照片上传。几乎你在开发中遇到的常见需求都能找到经过验证的解决方案避免重复造轮子。最后Python在数据处理和未来扩展上的优势。学生管理系统最终会产生大量数据。Python在数据分析Pandas, NumPy、可视化Matplotlib, Seaborn方面的强大生态意味着未来如果你想做更复杂的成绩分析、学习行为预测可以平滑地集成这些库扩展性非常好。当然没有银弹。Django在构建超大型、超高并发的微服务架构时可能会显得有些“重”但对我们这个量级的项目而言它的优势是压倒性的。国内越来越多的企业和高校采用Django进行业务开发其学习资料和社区支持的中文内容也日益丰富学习门槛相对较低。3. 核心模型设计与数据库构建3.1 数据模型关系梳理数据库设计是系统的基石。在Django中我们通过定义Model类来完成这一步。核心实体包括Student学生、Teacher教师、Class班级、Course课程、Score成绩。它们之间的关系是设计的难点和重点。经过多次迭代我采用的模型结构如下它较好地平衡了规范性与查询效率基础信息模型User使用Django内置的AbstractUser进行扩展增加role角色admin/teacher/student和mobile手机号字段。这是所有用户的基类。Student与User是一对一关系OneToOneField。包含学号、年级、所属班级ForeignKeytoClass等专属信息。将学生身份信息与登录认证信息分离更清晰。Teacher同样与User是一对一关系。包含工号、职称、所属学院等信息。教学组织模型Class班级模型。包含班级名称、入学年份、专业等信息。一个班级有多个学生Student反向关联。Course课程模型。包含课程代码、名称、学分、课程类型等。Teaching授课关系模型。这是一个中间模型用于关联Teacher、Course和Class。它表示“某位教师在某个学期给某个班级教授某门课程”。这个模型非常关键它解决了多对多关系的附加信息如学期、上课地点存储问题也是后续成绩录入的依据。业务核心模型Score成绩模型。这是系统的核心业务表。它包含以下关键字段studentForeignKeytoStudent哪个学生的成绩。teachingForeignKeytoTeaching关联到具体的授课任务。通过它可以间接确定课程、教师和班级。regular_score,midterm_score,final_score平时、期中、期末成绩。total_score总评成绩可以通过save()方法自动根据规则计算例如平时0.3期中0.3期末*0.4。is_publishedBooleanField成绩是否已发布学生端可见。这样的设计使得查询“张三的‘高等数学’课程成绩”非常直接先找到张三Student再通过Score表过滤teaching关系找到对应的Teaching记录进而确定课程。同时查询“李老师本学期所教的所有课程及学生名单”也很方便。3.2 Django Model代码实现与要点下面展示部分核心模型的代码并附上关键注释# models.py from django.db import models from django.contrib.auth.models import AbstractUser class User(AbstractUser): ROLE_CHOICES ( (admin, 系统管理员), (teacher, 教师), (student, 学生), ) role models.CharField(角色, max_length10, choicesROLE_CHOICES, defaultstudent) mobile models.CharField(手机号, max_length11, blankTrue) # 移除email的必填属性因为AbstractUser里email是必填我们覆盖一下 email models.EmailField(邮箱, blankTrue) class Meta: verbose_name 用户 verbose_name_plural verbose_name def __str__(self): return f{self.username}({self.get_role_display()}) class Student(models.Model): user models.OneToOneField(User, on_deletemodels.CASCADE, primary_keyTrue, verbose_name关联用户) student_id models.CharField(学号, max_length20, uniqueTrue) enrollment_year models.IntegerField(入学年份) class_belong models.ForeignKey(Class, on_deletemodels.SET_NULL, nullTrue, verbose_name所属班级, related_namestudents) class Meta: verbose_name 学生 verbose_name_plural verbose_name def __str__(self): return f{self.user.get_full_name() or self.user.username} - {self.student_id} class Teaching(models.Model): 授课任务表核心关联表 teacher models.ForeignKey(Teacher, on_deletemodels.CASCADE, verbose_name授课教师) course models.ForeignKey(Course, on_deletemodels.CASCADE, verbose_name课程) class_obj models.ForeignKey(Class, on_deletemodels.CASCADE, verbose_name授课班级) semester models.CharField(学期, max_length20) # 如“2023-2024-1” classroom models.CharField(教室, max_length50, blankTrue) class Meta: verbose_name 授课任务 verbose_name_plural verbose_name # 同一学期同一老师同一课程同一班级应该是唯一的 unique_together [teacher, course, class_obj, semester] def __str__(self): return f{self.semester} {self.teacher} - {self.course} {self.class_obj} class Score(models.Model): student models.ForeignKey(Student, on_deletemodels.CASCADE, verbose_name学生) teaching models.ForeignKey(Teaching, on_deletemodels.CASCADE, verbose_name授课任务) regular_score models.DecimalField(平时成绩, max_digits5, decimal_places2, nullTrue, blankTrue) midterm_score models.DecimalField(期中成绩, max_digits5, decimal_places2, nullTrue, blankTrue) final_score models.DecimalField(期末成绩, max_digits5, decimal_places2, nullTrue, blankTrue) total_score models.DecimalField(总评成绩, max_digits5, decimal_places2, nullTrue, blankTrue) is_published models.BooleanField(是否发布, defaultFalse) created_at models.DateTimeField(创建时间, auto_now_addTrue) updated_at models.DateTimeField(更新时间, auto_nowTrue) class Meta: verbose_name 成绩 verbose_name_plural verbose_name # 一个学生在同一门授课任务中只能有一条成绩记录 unique_together [student, teaching] def save(self, *args, **kwargs): # 自动计算总评成绩的逻辑示例规则可根据实际调整 # 注意处理空值情况 scores [] weights [] if self.regular_score is not None: scores.append(self.regular_score) weights.append(0.3) if self.midterm_score is not None: scores.append(self.midterm_score) weights.append(0.3) if self.final_score is not None: scores.append(self.final_score) weights.append(0.4) if scores and len(scores) len(weights): # 确保权重和为1或根据实际逻辑调整 total sum(s * w for s, w in zip(scores, weights)) self.total_score round(total, 2) else: # 如果成绩不全总评成绩可以为空 self.total_score None super().save(*args, **kwargs)实操心得在定义ForeignKey时务必显式设置on_delete参数。CASCADE表示级联删除SET_NULL表示置空需要字段允许nullTruePROTECT表示保护有关联数据时禁止删除。这决定了数据删除时的行为设计时需仔细考虑业务逻辑。另外使用related_name可以为反向查询提供一个清晰的名字例如class_obj.students.all()就能获取该班级所有学生。4. 视图逻辑与前端页面实现4.1 基于类的视图与权限控制Django提供了函数视图和基于类的视图两种方式。对于这类管理系统我强烈推荐使用基于类的视图特别是ListView、DetailView、CreateView、UpdateView、DeleteView这些通用显示/编辑视图。它们能极大减少重复代码。权限控制是管理系统的灵魂。我们使用Django自带的permission_required装饰器或PermissionRequiredMixin混入类结合自定义的用户角色字段来实现。首先在views.py中我们为不同角色创建不同的视图基类# views.py from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.views.generic import ListView, DetailView from .models import Student, Score class TeacherRequiredMixin(LoginRequiredMixin, UserPassesTestMixin): 要求用户必须是教师 def test_func(self): return self.request.user.role teacher class StudentRequiredMixin(LoginRequiredMixin, UserPassesTestMixin): 要求用户必须是学生 def test_func(self): return self.request.user.role student # 教师查看自己所教班级学生列表的视图 class MyClassStudentListView(TeacherRequiredMixin, ListView): model Student template_name teacher/my_class_students.html context_object_name students def get_queryset(self): # 重写get_queryset只返回当前教师所教班级的学生 teacher self.request.user.teacher # 获取该教师所有的授课任务 teachings teacher.teaching_set.all() # 从授课任务中获取所有涉及的班级 class_ids teachings.values_list(class_obj_id, flatTrue).distinct() # 返回这些班级的所有学生 return Student.objects.filter(class_belong_id__inclass_ids).select_related(user, class_belong)对于学生端我们同样需要严格限制其只能访问自己的信息。这里利用get_object方法进行过滤# 学生查看自己成绩的视图 class MyScoreListView(StudentRequiredMixin, ListView): model Score template_name student/my_scores.html context_object_name scores def get_queryset(self): # 只返回当前登录学生自己的、已发布的成绩 student self.request.user.student return Score.objects.filter( studentstudent, is_publishedTrue ).select_related(teaching, teaching__course, teaching__teacher__user)注意事项在编写查询时务必注意N1查询问题。上面的代码中使用了select_related和prefetch_related来一次性关联查询外键或ManyToMany字段这对于提升列表页性能至关重要。例如select_related(teaching, teaching__course)会在查询Score时通过JOIN一次性将关联的Teaching和Course数据取出避免了在模板中循环时对数据库的多次查询。4.2 模板渲染与前端交互Django使用自己的模板语言逻辑清晰易于学习。前端部分为了快速构建一个美观可用的界面我选择了Bootstrap 5框架。将Bootstrap的CSS和JS文件引入到基础模板base.html中所有其他页面继承它。一个关键的前端交互点是成绩录入。教师需要为一个班级的某一门课程批量录入成绩。我们设计一个表单动态列出该班级的所有学生并为每个学生提供成绩输入框。视图部分# views.py from django.views.generic.edit import FormView from django import forms from .models import Teaching, Student, Score class ScoreEntryForm(forms.Form): # 这是一个动态表单我们会在视图中构建它 pass class BatchScoreEntryView(TeacherRequiredMixin, FormView): template_name teacher/batch_score_entry.html form_class ScoreEntryForm success_url /teacher/success/ # 成功后跳转的URL def get_form(self, form_classNone): # 动态构建表单 teaching_id self.kwargs[teaching_id] self.teaching Teaching.objects.get(idteaching_id, teacherself.request.user.teacher) students self.teaching.class_obj.students.all() form super().get_form(form_class) for student in students: form.fields[fregular_{student.id}] forms.DecimalField( labelf{student.user.get_full_name()} - 平时, max_digits5, decimal_places2, requiredFalse ) # 类似添加 midterm_{student.id}, final_{student.id} 字段 return form def form_valid(self, form): teaching_id self.kwargs[teaching_id] teaching Teaching.objects.get(idteaching_id) students teaching.class_obj.students.all() for student in students: regular form.cleaned_data.get(fregular_{student.id}) # ... 获取其他成绩 score, created Score.objects.update_or_create( studentstudent, teachingteaching, defaults{ regular_score: regular, # ... 设置其他成绩 } ) return super().form_valid(form)模板部分(batch_score_entry.html){% extends base.html %} {% load crispy_forms_tags %} {% block content %} h2批量录入成绩 - {{ teaching.course.name }} - {{ teaching.class_obj.name }}/h2 form methodpost {% csrf_token %} {{ form|crispy }} button typesubmit classbtn btn-primary提交成绩/button /form {% endblock %}这里使用了django-crispy-forms库它能自动将Django表单渲染成符合Bootstrap样式的HTML非常方便。5. 高级功能与项目优化实战5.1 数据导入导出与报表生成手动逐条添加数据是低效的。我们利用django-import-export库为Admin后台增强数据导入导出功能。安装后在admin.py中为模型创建对应的Resource类。# admin.py from import_export import resources, fields from import_export.admin import ImportExportModelAdmin from .models import Student class StudentResource(resources.ModelResource): # 可以自定义导入导出字段的映射和清洗逻辑 class_belong fields.Field(attributeclass_belong, column_name班级名称) user__username fields.Field(attributeuser__username, column_name用户名) class Meta: model Student fields (student_id, user__first_name, user__last_name, user__username, enrollment_year, class_belong) export_order fields admin.register(Student) class StudentAdmin(ImportExportModelAdmin): resource_class StudentResource list_display (student_id, user_full_name, enrollment_year, class_belong) list_filter (class_belong, enrollment_year) search_fields (student_id, user__first_name, user__last_name) def user_full_name(self, obj): return obj.user.get_full_name() user_full_name.short_description 姓名现在在Student的管理页面就会出现“导入”、“导出”按钮支持CSV、JSON、XLS/XLSX等格式。这对于批量初始化学生数据或备份数据非常有用。报表生成是另一个亮点。我们使用Pandas和Matplotlib来生成简单的成绩分析图表。例如在教师视图下可以查看所授课程的成绩分布直方图。# views.py (部分代码) import pandas as pd import matplotlib.pyplot as plt from io import BytesIO import base64 def course_score_distribution(request, teaching_id): teaching get_object_or_404(Teaching, idteaching_id, teacherrequest.user.teacher) scores Score.objects.filter(teachingteaching, total_score__isnullFalse).values_list(total_score, flatTrue) if scores: # 使用Pandas处理数据 s pd.Series(list(scores)) desc s.describe() # 获取均值、标准差等统计信息 # 使用Matplotlib绘图 plt.figure(figsize(8,5)) plt.hist(s, bins10, edgecolorblack, alpha0.7) plt.title(f{teaching.course.name} 成绩分布) plt.xlabel(分数) plt.ylabel(人数) # 在图上标注平均分 plt.axvline(desc[mean], colorred, linestyle--, labelf平均分: {desc[mean]:.2f}) plt.legend() # 将图片转换为base64嵌入HTML buffer BytesIO() plt.savefig(buffer, formatpng) buffer.seek(0) image_png buffer.getvalue() buffer.close() graphic base64.b64encode(image_png).decode(utf-8) plt.close() else: graphic None desc None return render(request, teacher/score_distribution.html, {graphic: graphic, stats: desc, teaching: teaching})在模板中可以直接使用img srcdata:image/png;base64,{{ graphic }}来显示图表。虽然这种方式不适合高并发但对于内部管理系统生成一次性报表简单有效。5.2 项目部署与性能调优要点开发完成最终需要部署。对于毕业设计演示或个人小项目我推荐使用PythonAnywhere、Heroku或国内的阿里云/腾讯云轻量应用服务器配合Nginx Gunicorn的方案。部署基本步骤收集静态文件运行python manage.py collectstatic将各app的静态文件收集到统一的目录。配置生产环境设置创建settings_production.py覆盖DEBUGFalse设置正确的ALLOWED_HOSTS配置数据库推荐使用PostgreSQL或MySQL而非SQLite并设置好静态文件路径。使用Gunicorn作为WSGI服务器pip install gunicorn然后使用gunicorn your_project.wsgi:application来启动应用。使用Nginx作为反向代理Nginx处理静态文件效率远高于Django并将动态请求转发给Gunicorn。配置中需注意proxy_pass指向Gunicorn的本地端口。进程管理使用systemd或Supervisor来管理Gunicorn进程确保服务在崩溃或服务器重启后能自动恢复。性能调优的几个关键点数据库层面如前所述善用select_related和prefetch_related。为频繁查询的字段如student_id,user__username建立数据库索引。定期使用django-debug-toolbar来分析和优化查询。缓存对于不经常变化的数据如学院、专业列表使用Django的缓存框架。from django.core.cache import cache可以很方便地设置和获取缓存。静态文件务必确保在生产环境中静态文件由Nginx直接服务而不是经过Django。这能极大减轻应用服务器负担。分页任何列表查询都必须使用分页。Django的Paginator类或基于类视图的paginate_by属性能轻松实现。6. 毕业设计文档撰写与源码使用指南6.1 如何将项目转化为毕业设计论文有了可运行的系统毕业设计就成功了一大半。论文部分需要将你的开发过程系统化、理论化地呈现出来。论文结构通常包括摘要、关键词精炼概括项目背景、目标、采用的技术、实现的功能和特色。绪论阐述学生信息管理的现状与意义分析现有系统的不足提出本系统的设计目标。相关技术介绍详细介绍Python、Django、Bootstrap、MySQL等技术栈的特点和选择理由。切忌简单罗列要写出它们在本项目中的具体应用价值。系统分析包括可行性分析技术、经济、操作、需求分析功能需求如上述模块、非功能需求如性能、安全性、业务流程分析用流程图说明成绩录入等核心流程。系统设计这是重点。包括系统架构设计B/S架构、功能模块设计给出模块结构图、数据库设计务必给出详细的E-R图并将核心数据表结构以表格形式列出包括字段名、类型、说明、约束等。系统实现展示核心功能的实现界面截图并辅以关键代码片段进行说明。例如展示成绩录入的视图函数和模板代码并解释其逻辑。系统测试描述测试环境、测试用例如登录测试、成绩录入测试、权限测试和测试结果。最好有测试用例表格。总结与展望总结项目完成的工作指出系统的优点和当前不足并提出未来可能的改进方向如增加手机APP、集成更智能的数据分析等。避坑指南论文中最容易出问题的是数据库设计图和代码截图。E-R图务必使用规范的图形矩形实体、菱形关系、椭圆属性并用Visio、Draw.io等工具绘制清晰。代码截图应选择有代表性的片段注意排版和语法高亮避免大段无意义的代码堆砌。源码可以放在附录或作为附件提交。6.2 源码包结构与快速启动指南我提供的源码包student_management_system.zip解压后目录结构清晰遵循Django最佳实践student_management_system/ ├── manage.py # Django项目管理脚本 ├── requirements.txt # 项目依赖包列表 ├── sms/ # 项目主目录 │ ├── __init__.py │ ├── settings.py # 开发环境设置 │ ├── settings_production.py # 生产环境设置示例 │ ├── urls.py # 项目级URL路由 │ └── wsgi.py ├── apps/ # 应用目录模块化清晰 │ ├── users/ # 用户认证与基础信息应用 │ ├── student/ # 学生信息管理应用 │ ├── course/ # 课程与教学管理应用 │ └── score/ # 成绩管理应用 ├── static/ # 静态文件CSS, JS, images ├── media/ # 用户上传文件如学生照片 ├── templates/ # 全局模板文件 └── README.md # 项目详细说明文档快速启动步骤环境准备确保已安装Python 3.8和pip。安装依赖在项目根目录下运行pip install -r requirements.txt。配置数据库默认使用SQLite便于快速启动。如需MySQL/PostgreSQL修改sms/settings.py中的DATABASES配置。生成数据库表依次运行python manage.py makemigrations和python manage.py migrate。创建超级用户运行python manage.py createsuperuser用于登录Django Admin后台。导入初始数据可选我提供了一个fixtures目录里面有学院、专业等初始数据可以使用python manage.py loaddata fixtures/*.json导入。运行开发服务器python manage.py runserver。访问http://127.0.0.1:8000/admin/使用超级用户登录后台管理。访问http://127.0.0.1:8000/进入前台门户根据角色跳转。给二次开发者的建议从模型开始如果你想增加新功能比如“奖惩记录”首先在对应的app如student下的models.py中定义新的RewardAndPunishment模型并建立与Student的外键关联。注册到Admin在admin.py中注册新模型可以快速获得一个后台管理界面。设计URL和视图在urls.py中添加路径并创建对应的视图类或函数。编写模板根据视图返回的数据编写前端模板页面。循序渐进不要试图一次性修改所有东西。从一个小的、独立的功能点开始测试通过后再进行下一个。这个项目就像一个精心搭建的乐高底座提供了稳固的结构和核心组件。你可以在此基础上根据自己的想法和需求添加新的模块修改界面样式或者集成更复杂的功能。希望这份详细的拆解和完整的源码能成为你学习Django、完成毕业设计或启动一个小型管理系统的有力跳板。编程的乐趣就在于看着一行行代码构建起一个能解决实际问题的系统祝你在这个过程中玩得开心学有所成。本文还有配套的精品资源点击获取