不是我故意挑刺,但“垃圾分类”这四个字放在2025年的毕业设计选题里,确实有点两极分化。一方面,它听起来太“经典”了,经典到每年都有大批计算机专业的学生往这个方向上撞;另一方面,它又确实是个常做常新的题目——从最早的纯信息查询工具,到后来带图像识别的智能平台,再到结合语音、地图、积分激励的完整生态,每一年都有新的技术可以往里面塞。如果你正在为选题发愁,或者已经定下这个方向但不知道从哪儿下手,这篇内容就是给你准备的。
我写这篇东西的立场很明确:不是给你贴一段课程设计级别的代码,也不是堆一堆高大上的名词,而是从一个真正做过完整项目的角度,告诉你这个系统应该怎么拆、数据库怎么设计、识别功能到底是该自己训模型还是调接口、小程序端有哪些坑是踩了才知道的。我会尽量把每个环节背后的“为什么”讲清楚,让你不只是照着抄,而是真能理解这套系统是怎么长出来的。
1. 这个选题为什么值得做:需求拆解与技术含量分析
先说个很多人没想明白的问题:为什么每年都有大量毕业生选垃圾分类作为毕设题目?答案不是因为它简单,而是因为它天然具备一个“好毕设”的所有要素:有明确的社会价值背书、有清晰的两端业务逻辑(用户端和管理端)、有可深可浅的技术切入点(从纯数据库查询到AI图像识别都行),而且评审老师对这个题目的心理预期很稳定,不太会出现“这题目到底解决了什么问题”的灵魂拷问。
但稳定意味着平庸,如果你的系统只是做一个“输入垃圾名称,返回属于哪类”的查询工具,那确实没什么技术含量。所以这个题目真正要做出彩,核心在于两点:查询要有智能感,识别要有准确率,两者背后还得有一个撑得起场面的数据体系。
拆开来看,这个系统通常包含三条核心业务线:
- 垃圾名称查询:用户输入“过期饼干”或者“废荧光灯管”,系统返回它属于可回收物、有害垃圾、厨余垃圾还是其他垃圾,附带投放建议。这是底座功能,考验的是数据库设计和检索逻辑。
- 图像识别分类:用户拍照上传一张垃圾照片,系统通过图像识别模型判断类别。这是拉开档次的功能,很多人会在这里用现成的API,也有人选择自己训练轻量级模型,两种方案各有取舍,后面我会详细对比。
- 分类知识科普与统计:展示分类标准、环保知识,记录用户查询和识别历史,生成个人分类数据统计,甚至可以做积分体系。这些是让系统“活”起来的辅助功能,也是答辩时展示系统完整度的加分项。
从技术栈的角度看,题目里点名了Java和微信小程序,这基本框定了整体架构:后端用Java(一般是Spring Boot)提供RESTful API,前端用微信小程序原生框架或uni-app开发,数据库用MySQL,识别功能要么对接第三方图像识别API,要么用PyTorch等框架训练模型后封装成服务。这套组合的优势在于:前后端分离清晰,小程序端你有现成的微信生态支撑(登录、支付如果做扩展、订阅消息等),后端Java的生态成熟得不能再成熟,网上参考资料海量,遇到问题基本都能搜到解决方案。
我个人的看法是,这个选题的性价比相当高。它的业务复杂度不高不低,刚好能让一个本科生在一到两个月内完整做完并写出有深度的论文;但它又不是那种“换个皮就能交差”的题目,你必须把识别准确率、查询响应速度、异常数据处理这些细节打磨到位,不然答辩现场一演示翻车,场面会很尴尬。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统整体架构设计:前后端分离下的核心模块划分
定下选题之后,第一件事不是写代码,而是把系统架构画清楚。很多同学上来就建表、写接口,做到一半发现前端要的数据后端没给,后端给的字段前端用不上,来回返工非常痛苦。我的习惯是先把模块边界划分好,再把每个模块的输入输出定义清楚,最后才动手写代码。
2.1 整体架构:小程序端、服务端与数据端的三角关系
这套系统的整体架构可以分为三层:
展示层(微信小程序端):负责用户交互,包括登录页、首页(拍照识别入口 + 快捷查询入口)、垃圾查询页(支持文字输入和语音输入)、识别结果页、分类百科页、个人中心页(查询历史、收藏、统计)。小程序端只负责渲染页面和调用后端接口,不直接操作数据库,也不承载任何业务逻辑。
服务层(Java后端):作为核心枢纽,负责接收小程序端的HTTP请求,处理业务逻辑,访问数据库,调用外部识别服务。这一层可以细分为几个清晰的模块:
- 用户模块:微信登录对接、用户信息管理、session维护
- 查询模块:垃圾名称的精确查询、模糊查询、同义词匹配
- 识别模块:对接图像识别服务,处理图片上传与识别结果
- 数据模块:分类标准管理、垃圾词库管理、百科内容管理
- 统计模块:用户行为记录、查询热词统计、分类数据可视化
数据层(MySQL数据库 + 文件存储):存储用户数据、垃圾词库数据、识别记录数据、分类标准数据等结构化内容,同时用本地文件系统或对象存储保存用户上传的垃圾图片。
这三层之间通过HTTP接口通信,请求链路大致是:用户在小程序里拍照 -> 小程序把图片上传到后端 -> 后端存储图片并调用识别服务 -> 识别服务返回分类结果 -> 后端把结果落库并返回给小程序 -> 小程序渲染结果页。整个过程看起来简单,但每一步都有值得优化的细节。
2.2 后端技术选型与具体职责
后端我建议直接用Spring Boot,版本选2.7.x或3.x都行,看你熟悉哪个。Spring Boot的好处不用多说,自动配置、起步依赖、内嵌Tomcat,能让你把精力集中在业务代码上。配合MyBatis-Plus操作数据库,比原生JDBC写起来舒服太多,分页查询和条件构造器都是现成的。
再配合这几个常用组件:
- Sa-Token或JWT:做登录认证。小程序端每次请求携带token,后端拦截器校验身份。我习惯用Sa-Token,因为它对小程序的场景支持比较友好,登录会话管理比手写JWT省事。
- Redis:做缓存。垃圾查询接口的热门词条可以缓存,识别结果的近期记录也可以缓存,避免频繁打数据库。如果不方便装Redis,用Caffeine本地缓存也能扛住毕设级别的并发。
- MinIO或本地文件存储:保存用户上传的垃圾图片。毕设阶段用本地目录存储其实完全够用,把上传路径和访问路径配置好就行。
这里有个容易忽略的点:小程序的request域名必须是HTTPS且备案过的,但开发阶段可以在微信公众平台里勾选“不校验合法域名”,用http://localhost或局域网IP调试。很多人一开始就卡在这里,以为代码有问题,其实就是开发环境没配置对。
2.3 小程序端的页面结构与交互逻辑
小程序端我建议用原生框架来实现,不是不能用uni-app,而是原生框架对于毕设来说调试更直接,文档也更贴近微信生态。核心页面大概这么几个:
- 首页:顶部是搜索框(支持文字和语音),中间是两个大按钮引导用户进入拍照识别或手动查询,下面是热门垃圾词条推荐。这个页面承担了大部分流量入口的角色。
- 拍照识别页:调用
wx.chooseMedia让用户拍照或从相册选图,选完后上传到后端,展示识别中动画,识别完成后跳转结果页。 - 查询结果页:展示垃圾名称、所属分类、分类图标(颜色区分)、投放指导、常见误区,下方有“加入收藏”和“查看详情”按钮。
- 分类百科页:按垃圾分类标准展示各类别的详细说明,包括定义、常见物品列举、投放注意事项。
- 个人中心页:展示用户头像昵称、我的收藏、查询历史、识别历史、每日分类统计(比如本周分类了多少次、各类别占比)。
页面之间靠wx.navigateTo跳转,全局状态用app.globalData或Storage管理。我个人的建议是,页面数量控制在6到8个,不要为了追求页面多而凑数,每个页面把功能做扎实,比弄一堆空壳页面有价值得多。
3. 数据库设计:垃圾词库与用户行为数据的表结构实践
数据库设计是这套系统最重要的地基工程,没有之一。很多人的表建得稀烂——垃圾名称直接存一个字段、分类标准写死在代码里、用户行为数据根本不落表——这些都是答辩时容易被问穿的地方。我下面给出的表结构是经过实际项目验证的,你可以直接参考。
3.1 核心表结构:垃圾词库表的分层设计
垃圾词库是这个系统的灵魂,它的设计好坏直接决定了查询功能的体验。我建议用三张表来完成词库与分类的关联:
垃圾分类标准表(garbage_category)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| category_name | varchar(50) | 分类名称:可回收物、有害垃圾、厨余垃圾、其他垃圾 |
| category_code | varchar(20) | 分类编码,如recyclable/harmful/kitchen/other |
| icon_url | varchar(255) | 分类图标的URL |
| description | text | 分类详细说明 |
| create_time | datetime | 创建时间 |
垃圾词条表(garbage_item)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| name | varchar(100) | 垃圾名称,如“过期饼干” |
| alias_name | varchar(255) | 别名集合,用逗号分隔,如“饼干,曲奇,苏打饼干” |
| category_id | bigint | 关联garbage_category表的id |
| disposal_tips | varchar(500) | 投放指导,如“请清空内容物后投入厨余垃圾” |
| is_harmful | tinyint | 是否属于有害垃圾,用于前端特殊标注 |
| hot_value | int | 搜索热度,用于热门推荐排序 |
| create_time | datetime | 创建时间 |
用户识别/查询记录表(user_query_record)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| user_id | bigint | 用户id |
| query_type | tinyint | 查询方式:1-文字查询,2-图像识别 |
| query_content | varchar(255) | 查询的内容(垃圾名称或图片URL) |
| result_category_id | bigint | 识别/查询结果对应的分类id |
| is_correct | tinyint | 用户是否反馈“识别正确”,用于评估识别效果 |
| create_time | datetime | 查询时间 |
这套设计的核心思路是把“分类标准”和“具体垃圾”解耦。分类标准是稳定的四类(或者按你所在城市的细分标准),而垃圾词条是不断扩充的动态数据。这样以后要更新某个分类的说明,只需要改分类表,不用批量改词条;要增加词条,也只需要往词条表插入一条记录,天然支持后台管理。
3.2 用户表和收藏表:支撑个人中心功能
用户表沿用微信小程序的unionId/openId体系,主要存openId、昵称、头像、注册时间。这里有一个要点:小程序端获取用户手机号和头像现在都需要用户主动授权,不能一进来就弹窗索取,否则会被微信审核打回。建议首次进入时先用wx.login静默获取openId,等到用户需要展示个人信息时再引导授权。
