ARTICLE DETAIL

资讯详情

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

基于微信小程序的防返贫监测系统毕业设计全流程解析

基于微信小程序的防返贫监测系统毕业设计全流程解析 防返贫监测这个题目几乎是这几年计算机毕业设计里最稳的一类选择。它有两个天然优势一是业务场景非常清晰村干部、帮扶责任人、农户这三类角色天然存在需求不用凭空编造二是它属于民生政务类应用评委和导师一看就知道系统在解决什么问题答辩的时候不太容易出现“你这系统到底有什么用”的灵魂拷问。但题目稳不代表做起来容易尤其是基于微信小程序来实现涉及到小程序端、后端接口、数据库设计、权限控制全套链路想拿到一个漂亮的高分还是得下点功夫。这篇文章我就把自己做这类毕业设计完整梳理一遍从需求拆解、技术选型、数据库设计到核心代码实现、避坑指南全部摊开来讲。不管你是刚准备选题还是已经数据库建到一半卡住了都能从中找到对应阶段的参考。1. 项目整体设计与思路拆解1.1 防返贫监测业务的真实流程先把业务逻辑搞清楚这是整篇设计的地基。防返贫监测小程序的核心闭环是“农户信息采集 → 风险预警触发 → 入户核查确认 → 帮扶措施落实 → 动态跟踪销号”。也就是说系统不能只是一个花架子展示界面而是要支撑起一套完整的工作流。具体拆开来看村一级的网格员或者村干部负责采集农户的基本信息、收入情况、支出情况、教育医疗负担、住房饮水安全等信息提交之后进入待审核状态乡镇一级的审核人员负责确认预警信息是否属实确认属实后生成帮扶任务帮扶责任人接收到任务后需要填写每次入户走访的记录、帮扶措施、帮扶成效最终经过一段时间的持续跟踪确认农户风险已经消除再由管理员完成风险销号。这三个角色其实对应了三种不同的微信小程序端页面和权限采集端、审核端、帮扶端。再加一个后台管理的Web端用于系统配置、数据统计、兜底管理。1.2 为什么选择微信小程序而不是App或H5这个问题在开题答辩里几乎是必问的提前想好答案非常关键。选微信小程序最直接的原因是零安装微信几乎是所有人手机里的标配应用农户或者村干部不需要额外下载App也就少了推广使用的门槛。这个对政务类应用来说太重要了之前很多地方做精准扶贫系统最后死在推广环节很大一部分原因就是App安装成本太高基层人员根本不配合装。第二个原因是开发成本低。小程序的前端是WXMLWXSSJS前端同学上手非常快服务端可以随便结合自己的擅长语言而且小程序的云开发能力能够极大简化后端运维负担。作为毕业设计这不是在做一个生产级千万用户产品而是要在有限的几个月时间内完整跑通一个业务闭环小程序无疑是性价比最高的选择。第三个原因是微信生态自带的身份识别。wx.login 拿到 code 之后后端配合 openid 就能实现无感注册登录不用单独做短信验证码、密码登录这些繁琐的体系这对政务系统来说既安全又省事。1.3 功能模块的完整划分一个完整的防返贫监测小程序功能模块大致分这么几块农户信息管理农户的建档、基本信息维护、家庭成员管理、收入支出台账风险预警中心根据采集数据自动判断是否触发返贫风险形成预警工单入户核查与走访帮扶责任人提交走访记录支持现场拍照和定位帮扶任务管理任务的分配、流转、进度跟踪、销号归档数据统计大屏乡镇内各村预警数量、已销号数量、帮扶成效统计系统管理用户角色权限、基础数据字典、帮扶政策库这些模块里最容易出彩也最容易做砸的就是风险预警中心。很多毕业设计做成了简单的CRUD农户信息表、走访记录表增删改查一遍像个信息管理软件而不是监测系统。防返贫监测的核心竞争力在于“监测”两个字——系统要能主动预警而不是被动的台账记录。所以我后面单独拿出一个章节来展开预警规则是如何设计的这里先按下不表。2. 技术栈选型与架构搭建2.1 前端选型原生小程序还是uni-app这是很多同学拿到题目后第一个纠结的点。我个人的建议是如果项目定位是“代码纯原创、含金量高”选原生小程序如果你自己更熟悉Vue语法、希望一套代码以后还能复用出H5或者App版本uni-app是更好的选择。原生小程序的好处是没有任何框架封装的黑盒你写的每一行代码都发生在你熟悉的小程序框架内编译过程简单出问题时排查链路短。而且现在的原生小程序开发体验已经相当不错支持npm构建也可以用官方的TypeScript模板。毕业设计答辩时评委如果问起某个组件是怎么实现的原生代码的每一个函数你都能解释得清清楚楚。uni-app的优势在于开发效率和跨端能力。它基于Vue语法组件化方式跟Vue几乎完全一致如果你Vue基础好开发速度会明显快过原生。而且遇到需要做H5管理后台时同一套代码还能打包成H5部署省不少事。代价是定位问题时有些报错信息是经过了编译层的原生的报错定位可能会被一层编译映射掩盖。我自己做这类设计一般倾向原生小程序。原因很简单毕业设计的时间和精力有限没有那么多时间去折腾框架本身的兼容问题原生遇到的问题、踩过的坑网上的解决方案一搜一大把。2.2 后端方案Java Spring Boot 还是 Node.js、Python后端选择上我见过三种主流方案Java Spring Boot、Node.jsExpress/NestJS、PythonFlask/Django。Java Spring Boot是计算机科班生比较稳妥的选择。它的优势是生态成熟数据库访问有MyBatis/JPA统一的规范部署资料多而且在写论文的时候“基于Spring Boot的分层架构”这一章理论上限很高写起来也很有内容。劣势就是启动慢、配置多如果平时不熟Java学习成本略高。Node.js适合前端底子好的同学。如果你小程序端是原生JS写的后端也用JS那整个项目语言统一前后端思路贯连起来很顺畅。而且Express写接口非常轻量上手快做原型最合适。但Java课程的老师可能会不太喜欢如果你所在学校答辩组有后端方向的老师问起高并发场景下的性能Node单线程模型还是容易被围攻。Python的Flask/Django路线适合非科班但Python比较熟的同学。Flask轻量、自由度高Django自带Admin后台管理端开发速度极快。但有一个很现实的问题如果你们学院的主流技术栈是Java/Spring你用Python做后端答辩时可能会有“为什么不跟主流”的质疑这时候你需要有非常清晰的技术选型理由。我在这个项目里用了Java Spring Boot MyBatis Plus。理由很直白毕业后求职方向如果是Java开发这项目能写进简历作为项目经历团队协作、代码规范、文档成熟的保障也是三者里最高的。2.3 数据库MySQL还是云开发数据库这块要分两种情况说。如果你的毕业设计是纯个人完成并且老师允许使用小程序云开发那么云开发的云数据库真的能帮你省掉一大部分后端工作量。云数据库是NoSQL风格集合文档的结构灵活性很高而且自带权限控制小程序端可以直接调用数据库API进行增删改查。最关键是免费额度够用省去了自己买服务器、部署、备案的麻烦。但这里有一个隐患很多学校答辩组对“后端工作量”有硬性要求你用了云开发以后整个服务端逻辑几乎全部省掉了论文里“服务端设计”只能写云开发配置工作量论证上会比较吃亏。评委看到你没有一个独立部署的后端服务会觉得项目深度不够。所以更推荐的传统路线是自建后端 MySQL 小程序前端。这也是绝大多数毕业设计比较标准的架构。MySQL表结构适合描述防返贫这种明显带有各种关联关系的业务模型农户-家庭成员-走访记录的关联查询、汇总统计SQL写起来很顺手。而且MySQL学习成本和资料丰富度都是最高的遇到任何问题都能解决。这个项目里我使用的是典型的单体Spring Boot分层结构Controller - Service - Mapper - Entity配合MySQL存储Redis用于缓存登录态和热点数据后面会解释为什么需要。代码结构清晰业务逻辑可复用答辩时往黑板上画图也很有底气。3. 数据库设计与核心表结构3.1 农户档案主表设计农户档案是整个系统的数据源头这张表设计得是否合理直接决定了后续所有功能好不好写。核心字段我按业务分组基础信息部分包含农户编号、户主姓名、身份证号、所在乡镇/村/组、联系方式、家庭人口数、建档日期、脱贫属性已脱贫/监测边缘户等。收支信息部分是预警规则的输入数据单独放冗余字段有利于快速判定不然每次预警计算都要去多张业务表中聚合碰到数据量一上来响应就会很慢。这些字段包括家庭年人均收入、主要收入来源、年度支出总额、医疗教育支出占比、住房类型、饮水是否安全等。识别字段包括监测状态正常/关注/预警/已消除、风险类型因病/因学/因灾/缺劳力、帮扶责任人ID、最近核查日期、是否纳入监测对象、监测开始和结束日期等。农户表设计中有一个很关键的经验身份证号必须是加索引的唯一字段而且要前端做校验、后端双重校验。防返贫系统的数据录入大部分是村干部在手机小屏幕上完成的误录的情况非常常见一个身份证号录入格式错误会导致后续所有的跨系统比对、查重全部失效。实际在代码里常用逻辑删除字段is_deleted用逻辑删除而不是物理删除。理由很现实政务系统里的数据要留痕人工误删除以后要能还原物理删掉一条农户数据可能引发监管合规问题。虽然作为毕业设计没有真实监管压力但这种设计思路在答辩时是能加分的点。3.2 走访记录表与帮扶任务表走访记录表是帮扶责任人工作的留痕依据也是整个系统唯一承担“现场证据”功能的表。设计字段时除了常规的业务内容我加了三个很重要但容易被忽视的字段第一个是走访定位经纬度。微信小程序端通过wx.getLocation可以获取到当前位置这样可以防止帮扶责任人不到现场就填写虚假走访记录。我记得我们项目里还做了个隐藏校验逻辑定位距离村委会超过设定半径的就给出虚假走访提醒。第二个是现场照片路径列表。照片走小程序的上传接口传到对象存储数据库只存URL列表同时限制单次走访最多传9张图防止上传请求太大超时。第三个是走访状态字段包括待走访、已完成、逾期未走访。这个字段会联动生成提醒通知也是风险任务闭环里的一环。帮扶任务表的重点在于状态流转设计。我用state字段记录任务当前所处阶段可能的取值包括待接收、待入户、走访中、措施落实中、待复查、已完成销号、已归档。每一次状态流转都必须在小程序端触发对应的事件接口并同步记录流转历史到日志表。这个设计不仅是业务需要在答辩演示时效果也很直观——你给评委看一条任务从出生到完结的完整生命周期比干讲功能要有说服力得多。3.3 权限设计与角色表防返贫系统里的权限需求比一般教学管理类的系统更细。因为同一个村可能既有负责采集的网格员又有负责审核的乡镇干部还有外派的帮扶责任人这三类人在同一个窗口期可能会同时操作同一条农户数据。我是用角色-用户-菜单三级权限模型。具体来说用户表只存基础信息和openid角色表存角色编码比如grid_member网格员、auditor审核员、helper帮扶责任人、admin管理员用户-角色关联表做多对多关联角色-菜单关联表决定前端菜单和按钮的显示权限。后端接口层面用一个自定义的RequireRole注解配合Spring AOP做拦截在Controller方法上加注解就能完成权限校验代码写起来非常干净。代码示例RequireRole({auditor, admin}) PostMapping(/audit/confirm) public Result confirmAudit(RequestBody AuditConfirmDTO dto) { // 审核确认业务逻辑 }需要注意前端隐藏按钮不是真正的安全措施任何小程序的请求都能被测出来。真正的权限控制必须落在后端的接口层校验前端只是做体验上的友好隐藏而已。4. 风险预警机制整个项目的灵魂4.1 预警规则如何做到真正“管用”防返贫系统的核心机制是预警预警规则设计得好不好一眼就能看出这个小程序是拼凑的还是自己思考过的。很多同学写预警功能时就是简单判断一下年人均收入是否低于某个数值低于就触发预警。这本质上是一个单变量阈值判断不能说错但太简陋了。真实业务中返贫风险是多维因素叠加的结果。我设计了一套计分制规则每个维度有一个得分权重。比如家庭年人均收入低于当地监测线是一个关键判断项医疗支出占家庭年度收入比重超过一定比例的加计一分家庭主要劳动力患病或者缺失劳动力加计一分住房条件不安全加计一分家有义务阶段在读学生且教育支出压力大加计一分。各项得分累加以后如果总分达到2分及以上就会自动生成预警工单转入“重点关注”状态恰好1分的进入潜在观察名单由网格员在一定周期内再次核实更新数据。这个设计的优点是肉眼可见的贴近业务。你可以在答辩时举一个真实场景的反例某家庭收入略高于监测线确实不该触发收入阈值预警但家里同时有一个大病病人和两个在读学生这类家庭本来就是返贫高危群体单变量阈值判断会把这个最关键的目标漏掉。这套计分制规则能更敏锐地捕捉到这类高风险组合。4.2 预警触发后的工单流转预警工单的流程在项目里叫“监测闭环”就是农户档案从发现风险到最终解除风险的全生命周期。每触发一条预警系统自动创建一个工单工单状态从待审核开始流转。乡镇审核员在收到待审核工单之后需要根据系统中已有的数据以及线下掌握的情况判定这条预警是否属实。如果判断属实工单进入“待入户核查”同时自动通知该农户所在村的帮扶责任人如果判断不属实填写驳回原因工单关闭该农户的预警状态自动回落为正常。这个人工复核环节非常关键避免了纯自动规则导致的误报浪费基层工作时间。帮扶责任人收到入户核查任务后要去农户家实地走访通过小程序录入走访记录上传现场照片和定位信息。回到系统填写复核后的农户现状包括收入变化、大病好转情况、子女就业情况等最后提交核查结果。如果核查确认风险仍然存在帮扶任务进入措施落实阶段责任人要针对不同风险类型选择帮扶措施这里我内置了帮扶政策库比如帮助申请医疗救助、联系企业提供公益性岗位、纳入教育资助政策等。每条措施都有时间节点督促落实。最后的风险消除机制是我重点设计的点。风险消除不能简单靠“填写一条记录就自动完成”而是设置一个观察周期。触发预警后农户状态先进入“监测跟踪期”默认观察周期是3个月。在这个周期内帮扶责任人需要至少提交两次走访记录且两次记录都显示家庭状况好转系统才会判定风险可消除自动生成销号申请等待管理员审批后完成最终销号。这个机制的本质是防止系统被“造假销号”钻空子也符合真实的政务业务逻辑。4.3 预警计算的调度策略预警计算这件事我建议做成定时任务在每天凌晨进行全量数据扫描而不是每提交一条农户信息就实时计算一次。原因很简单农户数据采集是碎片化提交的今天录个收入、明天补个家庭成员如果每次改动都触发计算很可能同一个农户一天触发了好几次预警干扰审核端用户的注意力。定时任务每天的凌晨两点跑一次把所有农户的数据汇总后重新计算风险得分更新预警状态。新增的预警会产生工单已经处于关注状态的农户如果得分降下来了也会自动更新状态但这个不会直接销号只是通知网格员做进一步确认。具体的实现方案我用的是Spring Boot的Scheduled注解加一个每日定时方法。这里有一个小坑要提醒大家如果业务表数据量特别大全量扫描会导致定时任务运行时间过长超出预期窗口。更好的方案是分批次扫描比如按村依次处理每批处理完短暂休眠几秒避免数据库连接池被打满。Scheduled(cron 0 0 2 * * ?) public void dailyRiskScan() { ListString villageList villageMapper.selectAllVillageCodes(); for (String villageCode : villageList) { ListFarmerRiskDTO farmerList farmerMapper.selectFarmersByVillage(villageCode); for (FarmerRiskDTO farmer : farmerList) { riskRuleEngine.evaluateAndUpdate(farmer); } } }5. 小程序端核心功能的实操拆解5.1 登录注册与身份绑定微信小程序的登录逻辑不像Web端那么复杂但也有一套固定流程。小程序端在启动时调用wx.login拿到临时code通过后端接口传给服务端。服务端使用这个code调用微信官方接口换取这个用户的openid和session_key。openid是用户在所有微信小程序中的唯一身份标识换言之只要拿到了openid用户不需要注册就可以直接被识别。但是防返贫系统跟一般的小程序有区别门户需要实现人员角色的绑定。用户第一次打开小程序时需要输入账号信息帮扶责任人账号或者管理员分配的手机号进行绑定。绑定成功以后后续每次自动登录系统都能根据openid唯一识别出这个人是谁、属于哪个角色、能看到哪些数据。如果你用的是云开发云函数中的getWXContext可以自动获取到调用者的openid比自建后端少写不少代码。但我选的是自建后端加Redis方案openid换取完之后生成一个自定义的sessionId返回给小程序sessionId存在Redis里并设置过期时间。这样做是出于性能考虑每次请求都调微信接口换取openid太重了Redis缓存能轻松减轻微信接口的调用压力。具体绑定流程在小程序端是一个三步引导页面第一步用户授权手机号第二步输入后台分配的系统账号第三步确认绑定成功。涉及隐私的手机号授权直接在代码里用e.detail.encryptedData配合session_key解密不会在服务端留下明文手机号。5.2 表单采集性能优化与离线缓存防返贫系统中数据录入场景非常多农户建档、走访记录、措施反馈都是表单操作。在实际使用中测试下来反应最慢的就是照片上传和那种巨多的下拉联动选择。解决方案有三个第一个是下拉数据不每次都实时请求而是第一次获取后存入小程序的Storage设置一个有效期为一天的标志下次进来直接读缓存过期了再拉新数据。村名、成员关系、帮扶措施这些字典数据一天一变概率极低用缓存完全没问题。第二个是大表单分步提交。农户建档我拆成了四个步骤分别是基本信息、家庭成员、收支情况、住房与保障每一步单独提交。这个方案一方面是减少单次提交的数据包大小降低弱网环境的超时率另一方面也方便网格员在数据没录全的情况下分次补录。很多政务类的APP一张表单上几十个字段录到一半手滑退出就全没了这种体验基层根本没法用。第三个是图片上传压缩。wx.chooseImage拿到的本地图片体积普遍在2M以上直接上传不仅慢还浪费服务器存储空间。我在上传前用canvas做了等比压缩处理成宽为1280像素的JPG再传表单的体积会大幅下降。这里需要注意压缩是异步操作图片多的时候要做一个任务队列逐个排队上传避免并发请求太多导致微信CDN限流。5.3 走访打卡与定位防作弊走访真实性是这个系统最有看点的一个点定位防作弊则是里面非常亮眼的功能。小程序端在提交走访记录时需要用wx.getLocation取经纬度。注意事项比较多必须在页面中显式调用不能用异步函数里隐式地延迟调用否则getLocation会报授权失败。拿到经纬度以后跟服务端预置的村委办公点坐标做距离计算使用Haversine公式也就是球面两点间最短距离。如果距离超过一定阈值比如500米返回一个“不在村委附近”的提示由责任人二次确认是否继续强制提交。这个方案的业务逻辑很清楚入户走访大概率发生在农户家附近而村委的坐标偏差很小时远距离提交的数据在逻辑上就有造假的可能。function getDistance(lat1, lng1, lat2, lng2) { const rad d d * Math.PI / 180.0; const R 6371.0; const dLat rad(lat2 - lat1); const dLng rad(lng2 - lng1); const a Math.sin(dLat / 2) ** 2 Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLng / 2) ** 2; return R * 2 * Math.asin(Math.sqrt(a)) * 1000; // 返回米 }值得提醒的是小程序地理位置是需要用户手动授权并设置按钮触发的不能静默调用。若用户拒绝授权需要一套降级方案允许填写手动备注的地址信息同时标记为“未经过定位验证”。这个降级方案不是为了纵容造假而是因为现实中部分确实偏远的农户家庭附近没有稳定的GPS信号必须给一个合理的业务出口。5.4 首页信息聚合与红点提醒首页在小程序端承担了两个功能一是向不同角色用户展示和其相关的总览统计二是通过红点提醒机制告诉用户有待办事项。网格员和审核员首页重点展示所辖范围内总体监测概况比如监测户总数、已消除数、预警中数帮扶责任人首页展示的是我的待走访任务数量已走访数量以及即将超时的任务提醒。首页数据由后端统一提供聚合接口前端拿到后按角色渲染。红点提醒用的是小程序自带的tabBar需要给tabBar的某一个tab动态设置icon和badge信息。小程序原生tabBar一旦设置为自定义模式需要自己绘制tabBar来做红点。这个方案能实现非常丰富的角标样式但需要额外维护一个自定义tabBar组件开发量不小。大部分毕业设计建议直接用原生的badge能力通过wx.setTabBarBadge设置数字、wx.removeTabBarBadge清除功能上完全够用。6. 管理后台与数据分析6.1 后台框架选择管理后台我建议做一个Web端不建议在微信小程序里做完整的管理功能。原因很直白小程序的界面布局适合移动端轻交互但管理后台那种大列表、多条件筛选、报表图表还是电脑浏览器上做的体验最舒服。后台框架常见的三种选择若依RuoYi、Vue Element Admin、Ant Design Pro。若依是国内用得非常多的一款基于Spring Boot Vue的后台管理脚手架最突出的优势是功能全家桶用户、角色、菜单、字典、日志、代码生成器全都有拿到手就能用。缺点是框架代码太多如果你答辩时被评委问“这些代码都是你自己写的吗”修饰措辞会比较尴尬。Vue Element Admin更干净只有前端部分后端自己配。适合愿意自己写后端管理接口的同学。Ant Design Pro有非常完善的后台组件体系适合做数据可视化和大屏。我最后用的是Vue Element Admin的组合前端用Vue2 ElementUI后端对接已有的防返贫接口。6.2 统计大屏的核心指标管理系统里最有视觉冲击力的是一张预警统计大屏答辩演示时基本就是压轴亮场的角色。大屏上一般包含这些核心指标区域分布地图展示各村预警数量与已消除数量。乡镇地图的边界数据可以自己用GeoJSON简化出来不用追求特别精细够展示用就可以。趋势图按月展示新增预警工单数量和已销号数量卡一张双折线图能直观看出整体防控趋势是否有好转。排名榜展示预警数量最多的几个村用于提示重点关注。下沉式表格展示当前正处于监测跟踪期的农户清单对应的帮扶责任人、风险类型、距离观察期结束的剩余天数。这些大屏组件用ECharts实现非常方便数据接口在后端做一个SQL聚合查询按维度分组汇总。这里有一个注意事项统计SQL要避免在service层写一堆for循环去查数据库应该直接写一条group by sum的聚合SQL性能差距非常大。6.3 多维筛选与数据导出管理后台还承担了一个很实际的工具功能数据导出。乡镇干部定期要向上级报送监测工作台账如果没有导出功能光靠界面上看用起来会非常痛苦。导出功能的设计其实挺套路前端向后端发起任务创建请求后端生成一个异步任务数据量大时后台线程去查库组装用EasyExcel或阿里开源的FastExcel写Excel文件生成完毕放入文件存储然后前端轮询到这个文件后给用户一个下载链接。这个异步设计可以避免请求长时间挂在浏览器上等待实际使用体验会好很多。人员的多维筛选也是管理后台比较耗费功夫的功能。因为用户的构成相对复杂有按乡镇筛选、按村筛选、按角色筛选、按监测状态筛选、按风险类型筛选的组合条件。实现时只要注意不要把条件拼死在SQL里用MyBatis Plus的LambdaQueryWrapper动态拼接条件就好。LambdaQueryWrapperFarmer wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.isNotBlank(query.getVillageCode()), Farmer::getVillageCode, query.getVillageCode()); wrapper.eq(query.getMonitorStatus() ! null, Farmer::getMonitorStatus, query.getMonitorStatus()); wrapper.eq(query.getRiskType() ! null, Farmer::getRiskType, query.getRiskType());7. 常见问题与排查技巧实录7.1 微信小程序真机调试连不上后端做毕业设计最容易卡住的环节就是小程序从开发者工具转移到真机测试时突然全部请求失败。背后的原因几乎只有一个你代码里配置的后端接口地址写的是localhost或者127.0.0.1而手机显然访问不到你电脑的localhost等于白连着。解决办法自建后端时可以用内网穿透服务或者让手机和电脑连同一个WiFi然后把接口地址改成电脑的局域网IP。电脑的局域网IP用ipconfig查一下就行同时电脑防火墙需要放行对应端口。开发者工具预览模式下在真机调试时记得在项目配置里勾选“不校验合法域名”。上线阶段再换成HTTPS域名并在小程序管理后台配置服务器域名白名单。很多同学在上线环节繁琐建议直接在开发初期就把后端地址抽成一个独立的配置文件不要散落在一堆页面代码里。7.2 定时任务在本地跑了一次就重复执行Spring Boot的Scheduled默认是单机单线程的但如果你在开发过程中把服务重启了好几次而每次重启前上一次的任务恰好没有执行完就会出现重复执行。在跑预警扫描这种全量任务时尤其明显会生成大量重复工单。解决思路在任务一开始的地方获取数据库层面的分布式锁用一张任务锁表记录当前正在执行的任务标识和时间戳任务启动时先抢锁抢不到就说明已经有节点在跑直接放弃本次执行。虽然毕业设计不会真有多节点部署但养成这个习惯对以后做真正的生产系统很有帮助。7.3 小程序端请求超时排查看哪里排查小程序请求问题时需要养成一套有序流程。先用开发者工具的Network面板看具体请求状态请求有没有发出去还是发出去以后没响应。如果请求都没有先检查url有没有拼错如果发出去没响应再看后端日志有没有打印。后端接口偶尔会出现5xx那大概率就是代码问题比如SQL写错了、序列化失败后端在运行时才能暴露出来。这里一定要先看日志再改代码不要凭猜。还碰过一个很隐蔽的问题小程序请求里带了中文字符没有编码直接拼URL导致后端参数解析乱码。解决方式很简单前端传参时使用encodeURIComponent处理后端Spring Boot的application.yml里配置server.servlet.encoding.forcetrue解决接收乱码。7.4 Redis必装吗不装有什么后果这里想认真聊一聊Redis这个组件。很多同学的代码里其实没有使用Redis也没有spring-boot-starter-data-redis依赖。但如果你的项目是基于Spring Boot的我建议还是把这个组件加上哪怕功能用得少。因为它能帮你解决一个绝大多数非功能性亮点问题登录态的集中管理。如果没有Redis登录态只能存在后端的内存Map里或者直接存在前端Storage里前者服务一重启登录就全丢了后者有安全风险。用Redis管理session还能顺带做简单的接口防刷和热点数据缓存代码量不大收益却很明显。需要提醒的是自己电脑上装一个Redis Desktop Manager可视化工具即可启动服务跑在默认端口本地开发调用非常稳定基本不会遇到环境问题。7.5 论文里“系统测试”章节怎么写不空洞很多本科毕业论文的系统测试章节都是截图堆叠罗列一下登录成功了、列表显示了完全没有说服力。你需要在系统测试里体现专业的测试思路。功能性测试建议配合用例表来写每个用例包含用例编号、前置条件、输入数据、执行步骤、预期结果、实际结果和结论。挑大概10个左右最核心的业务场景出来就足够覆盖登录、绑定、农户建档、预警触发、工单审核、走访提交、销号申请、统计查询等关键链路。性能测试在论文里可以写最简单明了的接口响应时间统计用Postman或JMeter压一下登录接口、农户列表接口记录不同并发数下的平均响应时间和成功率。不用写什么天花乱坠的结果只要体现出系统在合理并发下跑得稳就行。8. 文档与答辩准备经验8.1 毕业设计文档的整体结构建议“LW文档”在这个题目里非常关键你需要提供给评审老师的是一整套设计文档不是一段代码。论文结构一般都遵循国际标准的顺序。摘要和绪论部分重点写清楚选题背景、国内外研究现状和研究内容这些内容从知网相关文献里提炼即可千万不要整段照抄查重会非常难过。系统关键技术介绍这部分罗列用到的框架和工具每个都概括它的用途和选型理由。系统分析章节重点写需求分析可以配用例图。系统设计章节写总体架构图和数据库ER图。系统实现章节对应各功能模块的页面截图和核心代码片段。系统测试章节对应测试用例和结果分析。最后的总结和展望两三句话即可不用长篇大论。我见过一个非常常见的低分原因论文里的代码跟实际项目的代码完全对不上。答辩老师如果翻了源码译文经典查重没事但代码对不上的硬伤会让整个工作的可信度直接归零。写文档时直接引用你最终完成版的核心代码片段而不是找个旧版本或者从别处粘贴一段是这章最重要的原则。8.2 为什么我喜欢把防返贫监测作为毕业设计的“简历级”项目除了能顺利毕业这个项目最大的意外收获是写进简历非常好用。原因在于它的业务复杂度适中有层次。它不是一个CRUD玩具它有角色权限、有自动规则引擎、有定时任务、有地理位置校验、有数据大屏、有异步导出任何一条拿出来都可以在面试时跟业务架构师和面试官聊上十几分钟。同时它的行业属性又属于政企数字化这类项目在求职时普适性非常强无论是投互联网公司还是软件公司、数字政务方向都有话可说。如果你后续想优化这个项目我建议可以考虑两个方向一个方向是把预警模型升级成机器学习训练的分类模型用历史已销号/已预警样本作为标签通过随机森林之类的方法预测新农户的风险概率另一个方向是引入小程序订阅消息让预警触发时自动给帮扶责任人推送待办通知。这两个方向都不难实现但做完以后项目的技术深度和故事性都会提升一个档次。我始终相信一点毕业设计最重要的不是一个分数而是通过一个完整的项目把大学里学到的零散知识点串成一条能用的业务链。防返贫监测小程序恰好就是这样一个能将需求分析、数据库设计、前后端开发、测试部署全部训练到的完整载体。只要踏踏实实把一个真实的模块闭环做出来答辩时这种作品会让老师眼前一亮。
返回列表