ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Django+微信小程序开发返校疫情管理系统:多角色审批流程全解析

Django+微信小程序开发返校疫情管理系统:多角色审批流程全解析 每年毕业设计咨询季我都会收到一批类似的问题学长用djangopython做微信小程序的大学学生返校疫情管理系统这个题该怎么下手很多人看到题目第一反应是“这东西是不是已经过时了”但真正做过之后你会发现它恰好是一个很经典的“多角色流程审批”场景把Django后端开发、微信小程序前端、数据库设计、权限控制和前后端联调全部串在一条完整业务链路里。工作量可控、演示效果好论文里的图表和测试用例也特别好写所以它非但没有过时反而是计算机专业毕业设计里最容易出成果的一类题目。这篇内容我按照一套可跑通系统的标准来拆解从需求梳理、后端设计、小程序端落地到本地联调、部署排错和论文呈现把每个环节的关键决策和踩坑点都讲清楚。已经选了类似题目的同学可以照着做还没定题目的看完也能判断这题到底适不适合自己。1. 先看清课题的本质这不是“疫情系统”而是一套流程审批平台1.1 需求方到底要什么返校场景背后的角色与流程拿到这个题目的大部分同学第一反应都是把重心放在“健康数据”上——体温、症状、位置恨不得做十个录入页面。但如果你站在学校管理者的角度想他们要的其实不是另一个打卡工具而是一套能支撑返校安排的审批管理平台。学生返校之前学校需要确定几件事你从哪里回来、最近健康状况怎么样、有没有接触过风险人群、是否需要隔离观察。围绕这些信息产生的动作是学生提交健康信息和返校申请辅导员进行初审学院管理员确认最终名单校医院或后勤部门获取异常数据汇总系统管理员负责账号和基础配置。这一条链路走下来本质就是一个带着“审批流”的信息收集与状态管理平台。所以做这个题的第一步不是写代码而是把业务流程图画出来把所有角色和状态转换列清楚。我建议至少分出四类角色学生每日健康上报、发起返校申请、查看审批结果。辅导员审核所带班级的返校申请、查看异常提醒。学院管理员做校级汇总与终审、导出统计报表。系统管理员维护账号、专业班级等基础数据、管理字典配置。角色都不复杂但每类角色的权限边界必须清晰这直接决定了后面Django端的接口设计和权限控制怎么做。1.2 为什么是 Django 微信小程序这个组合这个技术组合能被反复选中确实不是偶然。Django自带用户认证、ORM、Admin后台和表单校验管理信息系统这种封闭业务场景几乎是它天然的舒适区。你不需要像用Spring Boot那样准备一大堆繁琐配置写完模型、配好路由、挂上视图一个最简单的管理端就出来了。小程序端的优势更直接学生不需要安装App微信扫码就能打开。小程序原生的表单、列表、卡片组件对这类业务界面非常友好同一套页面做完代码量比同功能的Android原生少一半以上。再加上这两年各高校都在用企业微信、微信生态做校园服务小程序作为毕业设计选题在需求合理性这一关就很好解释。不客气地说这个课题用Java或PHP也能做同样能毕业。但在“信息收集—审批—汇总”这条路上Django自带的后台可以直接给管理员使用省掉大量自建页面和前端表格的工作量。这就是我优先推荐Django的理由后面你会体会到这个选择有多省时间。1.3 技术边界哪些功能必须做哪些写进论文但不实现做毕业设计最忌讳需求失控。我见过太多人一开始把“轨迹分析”“疫情预测”“消息推送”全塞进来结果做到一半发现根本做不完答辩前一周又疯狂删功能整个系统的完整性反而没了。我给一个经过验证的功能边界核心功能A学生健康信息填报包含体温、症状、风险接触情况、当前所在位置。核心功能B返校申请与审批包含申请提交、辅导员初审、学院管理员终审。核心功能C学生端查看个人状态和审批结果。核心功能D管理端数据查询、统计报表、Excel导出。加分功能异常数据自动标红、按学院/班级健康统计趋势图、返校名单导出。加分功能做简化版就行页面和数据流必须有但不一定追求大而全它主要是为论文“创新点”章节服务的。先把边界划清楚再把流程图画明白开发节奏才不会被拖垮。很多同学失败不是技术不行而是从一开始就没想清楚自己要交付什么。2. Django 后端的核心角色体系、模型关系和 API 设计2.1 用户模型怎么设计扩展 User 还是单独建表Django自带的User模型提供了用户名、密码、邮箱这些基础字段但缺少“学号”“班级”“角色”这类业务概念。常见的做法有两种一是直接在User模型上增加字段二是建一张Profile表和User做一对一关联。我推荐后者。新建一个Profile模型保存角色枚举和业务身份字段这样所有业务查询都集中在Profile上不污染Django内置表也能避免以后想升级Django版本时被自定义User表拖累。from django.contrib.auth.models import User from django.db import models class Profile(models.Model): ROLE_CHOICES ( (1, student), (2, counselor), (3, college_admin), (4, system_admin), ) user models.OneToOneField(User, on_deletemodels.CASCADE, related_nameprofile) role models.SmallIntegerField(choicesROLE_CHOICES, default1) student_no models.CharField(max_length20, blankTrue) college models.CharField(max_length50, blankTrue) major models.CharField(max_length50, blankTrue) class_name models.CharField(max_length50, blankTrue) phone models.CharField(max_length20, blankTrue) created_at models.DateTimeField(auto_now_addTrue)角色用IntegerField存数字枚举比存字符串更规范也方便权限判断时直接比较大小。业务代码里通过request.user.profile.role就能拿到当前身份不用到处判断User.username。2.2 核心业务表健康上报、返校申请、审批记录业务表重点看三张HealthReport健康上报、ReturnApplication返校申请、ApprovalRecord审批记录。健康上报表里有一个最容易忽略的约束每个学生每天只能上报一次。这个约束最稳妥的实现是数据库层的unique_together而不是在业务代码里先查询再判断。因为并发请求时代码层的“先查后写”会出竞态问题数据库唯一约束才是硬保证。class HealthReport(models.Model): student models.ForeignKey(Profile, on_deletemodels.CASCADE, related_namereports) report_date models.DateField() temperature models.DecimalField(max_digits4, decimal_places1) has_symptom models.BooleanField(defaultFalse) symptom_desc models.CharField(max_length200, blankTrue) has_risk_touch models.BooleanField(defaultFalse) current_location models.CharField(max_length100, blankTrue) remark models.TextField(blankTrue) created_at models.DateTimeField(auto_now_addTrue) class Meta: unique_together (student, report_date)返校申请表的重点在审批状态我建议用IntegerField做状态机1待审核、2辅导员已通过、3学院已通过、4已驳回。同时预留一个content字段存审批意见方便老师驳回时说明原因。审批记录表记录每一次动作包括操作人、操作时间、操作前后状态这是论文里“审批痕迹追踪”功能的依据答辩时也是加分点。2.3 RESTful 接口设计API 列表与登录方案接口层建议直接用Django REST Framework别自己造轮子手写JSON序列化。接口按业务模块划分如下认证类/api/auth/login、/api/auth/logout健康上报/api/health/reportPOST提交、/api/health/report?datexxxGET查询返校申请/api/return/apply、/api/return/list审批类/api/audit/pending待审核列表、/api/audit/approve执行审批统计类/api/stats/summary、/api/stats/export登录方案上小程序端推荐使用JWT而不是Django默认的Session。原因是小程序不像浏览器那样自带Cookie机制前端每次请求手动把Token放在请求头里调试和维护都更方便。具体做法是用djangorestframework-simplejwt这个库替换DRF的默认认证类。接口URL的命名尽量语义化别用/api/getdata这种含糊路径答辩老师看接口设计时合理的URL本身就是系统设计能力的体现。2.4 定时任务与统计模块不用急着上 Celery很多教程一提到定时任务就推荐Celery但对毕业设计这个规模来说Celery有点杀鸡用牛刀。Django的management command完全能胜任写一个python manage.py daily_sync命令里面执行健康数据汇总、状态提醒更新然后用系统的cron或者云平台的定时触发器每天调用一次即可。统计模块我用Django ORM的annotate按日期统计上报人数、按学院统计异常数。这些数据通过一个接口返回给小程序端或管理后台前端用图表库渲染。看起来不复杂但论文里“系统测试与数据分析”这一章数据都从这里来工作量一下子就充实了。3. 微信小程序端如何落地登录态、表单交互和接口联调3.1 登录流程wx.login 获取 code后端换 openid小程序端最耗时间的通常不是页面UI而是登录流程。你要记住一件事小程序的用户识别靠openid不靠账号密码。标准流程是页面onLoad时调用wx.login拿到一个临时code。通过wx.request把code发给Django接口。Django后端用code向微信服务端换openid和session_key。后端根据openid查找或创建User签发JWT返回给小程序。小程序把token存到wx.setStorageSync之后所有请求自动带上token。这里有个很隐蔽的坑小程序code的有效期只有五分钟而且只能用一次。如果前端因为网络抖动连续调用了两次wx.login第二个code就会失效。所以前端要做节流用一个isLogging标志位拦住重复登录请求避免无意义的报错。3.2 页面结构设计页面不在多够用就好页面数量我建议控制在六到七个首页、健康上报页、返校申请页、申请记录列表页、审批列表页、统计页、个人中心。毕业设计不需要做成一款商业化产品页面太多反而给自己增加联调负担。首页建议做成“状态卡片”式显示最近一次上报日期、体温是否正常、审批进度。需要特别注意的是自定义导航栏。小程序的默认导航栏在不同机型上高度不一致如果页面结构用了自定义导航栏需要先通过wx.getSystemInfoSync拿到状态栏高度和菜单按钮位置再动态计算导航栏高度否则在带刘海屏的设备上会出现内容塌陷。表单里的单选、下拉选择优先用小程序原生的radio-group和picker别为了好看引入复杂的自定义弹层。返校申请里的“交通方式”“学院”这些字段用picker就能解决维护成本低答辩时也不会因为组件显示异常而出丑。3.3 wx.request 封装与常见错误排查三分业务七分联调。小程序和后端联调中遇到的大部分问题根源都在网络请求上。我习惯封装一个统一的request方法把baseURL、header、token注入、错误码统一处理都放在一个文件里。// utils/request.js const BASE_URL https://your-domain.com/api; function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method: method, data: data, header: { Content-Type: application/json, Authorization: JWT wx.getStorageSync(token) }, success: (res) { if (res.statusCode 200 res.statusCode 300) { resolve(res.data); } else if (res.statusCode 401) { wx.removeStorageSync(token); wx.navigateTo({ url: /pages/login/login }); } else { reject(res.data); } }, fail: (err) { reject(err); } }); }); }联调时我遇到过最多的问题按出现频率排是这样本地地址不通模拟器里能访问localhost真机不行。真机调试时改用电脑的局域网IP同时确认手机和电脑连的是同一个Wi-Fi。接口返回但页面没数据八成是后端没有用JSON格式返回或者字符串含中文时没设置ensure_asciiFalse。请求报错类似10002这类网络超时错误排查顺序永远是后端服务有没有起来、前端URL对不对、服务器端口有没有放行、手机网络能不能通到目标IP。别一上来就怀疑代码逻辑看控制台看日志比瞎猜快得多。如果你手头有抓包工具比如Charles也可以用来观察小程序真实发出的请求头和响应体。特别是排查“请求头没带token”“后端返回了意外字符”这类问题时抓包能直接看到最原始的数据比在代码里打日志更直观。3.4 表单校验与用户体验细节健康上报表单里体温合理范围建议限制在34到42度之间超出直接前端拦截。风险接触选“是”时强制要求补充说明。这些校验在前端做一遍给用户即时反馈后端再做一遍防止有人绕过前端直接调接口。我还有一个使用习惯表单提交后不直接跳转而是先提示成功再延迟约半秒自动返回首页。用户会觉得反馈很顺滑。申请记录列表做下拉刷新状态变化时用户能及时看到最新结果这些细节在答辩现场演示时很能体现工程素养。4. 让数据安全不是一句空话权限隔离与隐私保护细节4.1 接口级权限怎么区分学生、辅导员和管理员很多学生项目的问题不是功能少而是接口权限几乎没有。任何登录用户把请求里的student_id改一改就能看到别人的健康记录这在答辩现场被老师试出来会非常尴尬。DRF的权限控制其实很优雅。为每个接口设置permission_classes再自定义一个基于角色的权限类from rest_framework.permissions import BasePermission class IsStudent(BasePermission): def has_permission(self, request, view): return request.user.is_authenticated and getattr(request.user.profile, role, None) 1更关键的是get_queryset方法。学生查询数据时强制过滤当前登录用户自己的数据而不是信任前端传过来的student_id。辅导员查询时过滤班级字段。这样即使接口被人猜到越权也拿不到数据。4.2 数据脱敏与最小化采集健康数据属于明确的隐私数据展示逻辑要有讲究。列表页只显示学号后四位、打码姓名、日期、状态导出Excel时才允许选择完整信息并且记录操作日志。小程序接口返回的字段也不要全量给用DRF的Serializer配置fields只序列化前端真正需要的字段。很多人写接口习惯model.objects.values()一把梭把所有字段都返回给前端这是非常不专业的做法。合理的最小化采集既保护隐私又减少网络传输量答辩时还能作为系统的安全设计亮点来讲。4.3 token 过期、HTTPS 和日志审计JWT默认过期时间一小时用户在页面停留稍长后续请求就会401。好的体验是封装层遇到401时自动刷新token不做自动刷新至少也要优雅跳转到登录页而不是白屏。token刷新接口要单独设计不能简单复用登录接口。线上环境微信小程序强制要求HTTPS和备案域名这在毕业设计里绕不开。本地联调可以关闭开发者工具的域名校验但答辩部署时一定要用HTTPS。申请免费证书、配置Nginx的步骤不复杂第5章我展开说。日志方面Django的LOGGING配置把请求的method、path、user_id记录到文件但不要记录完整的健康详情和token本身。这个“最小化日志”原则在论文的安全性设计里可以专门写一段。5. 本地联调与部署阶段的典型障碍5.1 微信开发者工具和 Django 本地服务的互通规则本地开发阶段小程序开发者工具模拟器可以直接访问localhost端口。所以Django跑在127.0.0.1:8000开发者工具里把接口地址填成http://127.0.0.1:8000/api/xxx是能通的。很多人卡住的点是模拟器能通一旦点“真机调试”就不行了。原因很简单手机不在开发机本地自然访问不到127.0.0.1。真机调试时要用电脑的局域网IP比如http://192.168.x.x:8000同时Django的ALLOWED_HOSTS要加上这个IP。另一个常见的坑是Windows电脑上第一次跑Django时报错信息很长很多人直接懵了。其实绝大多数情况是8000端口被占用或者MySQL驱动没装看完整报错最末尾的几行定位会比在网上搜原文快得多。5.2 跨域、CSRF 和 Django 中间件调整前后端域名不同理论上会有跨域问题。但小程序不是浏览器不存在传统意义上的CORS限制这一点能给你省下很多麻烦。需要留意的是Django的CSRF中间件它默认会拦截非表单POST。小程序以JSON方式发POST如果还开着CsrfViewMiddleware就会一直403。解决办法是对API视图加csrf_exempt或者在DRF配置里去掉Session认证改用JWT认证。顺带说一句很多实现教程里推荐的django-cors-headers在小程序开发场景其实可以不装装了也不起决定性作用。别给自己加不必要的依赖。5.3 MySQL、时区和中文乱码先避开这些默认坑数据库我推荐用MySQL虽然SQLite也能跑但论文里用MySQL更正式。建库时字符集指定utf8mb4不然中文写入会莫名报错。Django的TIME_ZONE设置为Asia/ShanghaiUSE_TZ一般保持True但要注意DateTimeField存的是UTC时间前端展示时需要转成本地时区否则时间总是看起来少了八小时。字段设计上还有一个建议不要用数据库关键字做字段名比如name、desc虽然Django会处理但遇到复杂查询时会增加不必要的坑。命名统一用student_no、class_name这类前缀明确的风格。5.4 小程序包体积超限和线上部署微信小程序有2MB的包大小限制。如果开发者工具提示类似source size 2612kb exceed max limit 2mb的报错说明代码包超了无法真机预览。解决办法有三个方向不用的图片放到云存储或CDN别塞在本地尽量用原生组件不要引入大型UI库拆分成主包和分包低频页面用subpackages懒加载。我见过很多人因为一个图表库就把包打到2.5MB其实换一种轻量实现包体积立刻降下来了。后端部署用Nginx加gunicorn或uwsgi配上免费HTTPS证书。这一步既是线上运行的前提也是论文部署章节的素材。如果不想自己买服务器腾讯云或阿里云的轻量应用服务器就够学生认证通常有优惠。6. 从项目到毕业论文测试、图表和工作量的呈现方法6.1 测试用例怎么写才像真实工作论文里的测试章节不能只贴运行截图。规范的写法是设计测试用例表包含测试编号、前置条件、操作步骤、预期结果、实际结果。列举几个关键用例学生提交健康上报成功后数据库记录条数增加一条。同一学生同一天重复提交接口返回重复上报错误。普通学生请求辅导员审批接口返回403。审批通过后学生端申请状态由待审核变为已通过。如果时间允许用Django的TestCase写核心接口的单元测试源码里带上测试代码答辩老师看到这个印象分会立刻不一样。测试不需要覆盖全部覆盖核心链路就够了。6.2 论文需要的图和表结构、画法与组织毕业设计论文里最核心的三张图是系统用例图、系统架构图和E-R图。画图要有逻辑用例图标清角色和功能边界架构图标清小程序、Django、数据库三层关系E-R图把关键实体和联系表示清楚。画图可以用draw.io或ProcessOn画完导出矢量图再插入论文。需要注意E-R图里的实体名和字段名要与数据库设计保持一致答辩老师一旦顺着图中实体去提问名字对不上会非常尴尬。数据库表结构在论文附录里用表格整理四列就够了列名、类型、约束、说明。性能测试和功能测试的表格也按统一格式排版整篇论文的图表风格保持一致看起来很专业。6.3 演示与答辩侧重点让系统在十分钟内讲明白答辩演示不要从头到尾点菜单而是按业务故事线走登录小程序端学生账户现场演示健康上报和返校申请提交。切到管理后台演示待审核列表和审批操作。再切回学生端展示申请状态变化。最后展示统计报表和导出功能。每个环节控制在两分钟以内。现场有条件的话把两个窗口提前摆成左右分屏学生端和管理端同时可见效果会非常直观。答辩老师常见的问题之一是“系统怎么防止学生伪造健康数据”这时你的“每日唯一上报约束、辅导员人工核实、异常状态自动标红”设计就派上用场了。答得有条理比系统本身炫酷更重要。“微信小程序登录获取手机号”也是答辩时可能被问到的一个点。如果你的系统设计里做了手机号绑定可以讲清楚button组件open-typegetPhoneNumber拿到加密数据后后端再通过会话密钥解密的流程。没做的话就直接说明当前账号体系基于openid手机号不是必选项属于最小化采集这也是一个正当理由。做这类毕业设计我一直跟来问我的人说同一句话答辩能不能过取决于两件事一是系统能不能跑通完整业务流程二是你能不能把每个技术决策讲出理由。这套djangopython微信小程序的大学学生返校疫情管理系统流程清晰、角色分明、技术栈在学术界认可度高剩下就是看你愿意花几天把细节打磨到什么程度了。遇到问题多翻微信官方文档和Django文档多打日志别在群里等着别人替你调代码。自己踩过的坑到答辩那天就是最扎实的底气。
返回列表