垃圾分类回收系统
创建于 2025 年 3 月 20 日
项目介绍
垃圾分类回收管理系统是一套面向社区环保场景的全流程业务平台,把”这垃圾算什么类、扔到哪里、谁来上门收、服务好不好”串成一条完整链路:居民先在垃圾分类指南里查清物品归属,从物品详情直接发起回收预约;回收人员接单后上门处理并推进状态;预约完成后居民还能对服务打分、提交投诉。项目同时配套知识科普文章与在线测试,用答题积分鼓励居民学习分类知识。
系统基于若依 RuoYi-Vue 3.8.8 二次开发,业务代码集中在 gc-management 模块,分为 manage(管理端 REST 接口,/manage/**)与 app(面向用户的前台接口,/api/**)两套控制器。前台接口注释里明确列出的功能清单是”垃圾分类列表、垃圾信息列表、知识测试、知识文章阅读、垃圾回收预约、个人中心”,并支持通过 http://localhost:8080/swagger-ui/index.html 在线调试接口。
项目架构
项目是标准的若依单体架构:后端按 gc-admin、gc-common、gc-framework、gc-system、gc-management、gc-quartz、gc-generator、gc-ui 模块划分,认证基于 Spring Security + JWT,数据库使用 MySQL(业务库 garbage_collection),Redis 承担验证码与会话缓存,Quartz 提供定时任务框架。核心业务表通过若依代码生成器(gen_table 记录)一键生成 CRUD 后再手工扩展,包括:
garbage_categories:垃圾品类表,内置 14 个分类(可回收、有害、湿/干垃圾,以及电子产品、金属、塑料、玻璃、纺织品、纸质、有机废物、危险废物、建材、其他);garbage_items:垃圾物品库,通过category_id外键关联品类,保存名称、描述与图片路径;garbage_collection_appointment:回收预约表,记录预约用户(create_by)、回收人员(update_by)、预约时间、投放地点、状态、服务评价与投诉信息;gc_article:知识科普文章表;questions:分类测试题库表。
前端为若依 Vue3 版(Vue 3.4 + Element Plus 2.4 + Pinia + Vite),同一套工程承载三种视图:管理端页面(views/manage/*,垃圾分类、物品、文章、题目、预约管理与数据处理)、用户端页面(views/user/*,数据看板、垃圾分类指南、知识测试、文章阅读)以及预约管理页(views/appointment/index.vue),图表统一使用 ECharts 5 渲染。
核心功能
- 垃圾分类指南:用户端以卡片墙展示物品库,每个物品带品类色标与详情弹窗(描述、处理方法、小贴士),支持按名称模糊搜索与品类筛选。后端
GarbageItemsMapper通过LEFT JOIN garbage_categories一次性带出分类名称(selectAllGarbageItemsWithCategoryName),模糊查询使用name like concat('%', #{name}, '%'),避免注入风险。 - 在线预约回收:在物品详情弹窗点击”预约回收”打开预约表单,填写预约日期(前端
disabled-date限制不可选过去日期、提示至少提前 24 小时)、投放地点、回收数量,并可上传投放地点照片辅助回收人员定位;提交成功后展示预约编号。预约数据走AppGarbageCollectionAppointmentController(/api/appointment/add),查询个人预约时服务端强制setCreateBy(String.valueOf(SecurityUtils.getUserId())),用户只能看到自己的记录。 - 回收处理闭环与角色权限:系统单独配置”回收人员”角色(
roleKey = recycle,操作日志可见菜单授权manage:appointment:list/add/edit/remove/export)。回收人员在处理页(views/manage/deal/index.vue)将预约状态从”待处理”推进为”回收中""已完成”;GarbageCollectionAppointmentServiceImpl.update会遍历当前登录用户的角色,只有命中”回收人员”才把update_by写为回收人员 ID。预约创建时自动初始化updateBy = "暂无回收人员回收"、complaints = "无投诉"、serviceRating = 5。 - 服务评价与投诉:预约状态为已完成时,预约管理页动态显示”评价""投诉”按钮,评价走
recycle_service_comment数据字典(极差/差/中/好等星级),投诉信息写入complaints字段,构成”处理 — 反馈”的完整服务闭环。 - 知识科普与测试:
gc_article提供垃圾分类重要性、塑料垃圾危害、电子垃圾处理等科普文章;题库内置 21 道选择题,前台接口AppQuestionsController用Collections.shuffle(list)随机打乱后截取前 10 题返回,前端逐题作答并统计得分(每题 10 分)、答对题数与用时,答对题目获得积分奖励。 - 数据看板:用户端看板展示垃圾分类数量、垃圾总数量、知识科普数量、预约回收数量四张统计卡片,配 ECharts 环形饼图(各品类物品占比,按分类聚合统计)与近 30 天预约趋势折线图(按
createTime逐日累加),接口异常时自动回退演示数据;管理端另有data-statistics页面,用柱状图呈现预约处理状态分布与评价数据分布。
功能截图
暂无运行截图。
快速上手
项目为 Maven + pnpm 工程,要求 JDK 1.8、Node 16+。环境准备分四步:
- 新建 MySQL 数据库
garbage_collection,导入garbage_collection.sql(或更新版20250320-2.sql),包含业务表、若依系统表、菜单权限、字典与演示数据; - 启动本地 Redis,按环境修改
application-druid.yml中的数据库连接与application.yml中的 Redis 配置; - 后端在
垃圾回收后端目录执行mvn spring-boot:run启动(默认端口 8080),前端在垃圾回收前端/Vue3目录执行pnpm install && pnpm dev(默认端口 80,开发代理将/api、/manage转发到后端); - 使用管理员账号(若依默认
admin)登录进入管理端,演示账号huishou(昵称”小收”)绑定”回收人员”角色,可登录处理页体验接单流程。
接口调试可直接访问 http://localhost:8080/swagger-ui/index.html,预约新增、个人预约列表等前台接口均可在线调用。
总结
这个项目的价值在于把垃圾分类这件”小事”做成了完整的产品闭环:知识库解决”怎么分”的认知问题,预约与上门回收解决”谁来收”的服务问题,评价投诉解决”服务好不好”的质量问题,知识测试与数据看板则承担教育与运营激励。技术上它是一次典型的若依业务二次开发实践——代码生成器产出基础 CRUD,再围绕预约状态机补上角色感知的业务逻辑(回收人员才可认领)、按当前用户隔离数据(只能看自己的预约)、字典驱动评价选项,最后用 ECharts 把业务数据可视化。
从实现细节看,updateBy = "暂无回收人员回收"、complaints = "无投诉" 这类默认值设计,以及前端”接口失败回退演示数据”的处理,都体现了从演示走向可用的小心思。后续可扩展的方向包括:预约时间与回收人员排班的冲突校验、积分兑换与环保贡献值排行、预约消息的短信/站内信提醒,以及将垃圾分类知识库对接图像识别做拍照识垃圾。