毕业设计实战:基于Java+SSM的失物招领平台设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

71 阅读19分钟

毕业设计实战:基于Java+SSM的失物招领平台设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

谁懂啊!当初做失物招领平台毕设时,光失物招领表和失物认领表的关联就卡了3天——一开始没设外键,查某件失物的所有认领记录时数据全串错,导师看了直接让我“重画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!

一、先搞懂“失物招领平台要啥”!需求分析别瞎蒙

刚开始我跳过需求分析就写代码,花两周加了个“物品智能匹配算法功能”,结果导师一句“核心是失物管理与认领互动,不是复杂算法”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。

1. 核心用户&功能拆解(踩坑后总结版)

失物招领平台就两类核心用户:管理员普通用户(别加“访客角色”!我当初加了后,权限逻辑混乱,未登录就能提交认领申请,最后砍掉才顺畅):

  • 管理员端(必做功能):
    • 用户管理:查看用户列表(姓名、手机号、身份证号)、重置用户密码、禁用违规账号,显示用户头像和基础资料
    • 失物管理:维护失物招领信息(新增/修改/删除/标记状态)、上传失物照片,支持按物品类型/状态筛选(我当初没加,找失物要翻几十页)
    • 认领管理:处理失物认领申请(审核认领信息、标记审核状态)、查看认领记录,支持按失物编号筛选
    • 内容管理:公告管理(发布平台通知、维护公告类型)、论坛管理(审核帖子、删除违规留言)、字典管理(维护物品类型/分类标签)
  • 用户端(核心功能):
    • 失物查询:查看失物招领/物品挂失列表(按物品类型/时间筛选)、查看失物详情(含照片、拾遗地址、物品状态)
    • 互动操作:提交失物招领、发布物品挂失、申请失物认领、对失物留言咨询,查看认领审核进度
    • 个人中心:修改个人信息(头像、手机号)、查看我的招领/挂失/认领记录、管理个人联系信息

2. 需求分析避坑指南(血泪教训!)

  • 别光靠“空想”!找2个同学分别模拟管理员和失主提意见:比如有用户说“想快速区分已认领/待认领的失物”,我才加了“失物状态标色”(已认领标绿色/待认领标蓝色),比瞎加“智能匹配”实用多了
  • 一定要画用例图!用DrawIO画简单版,标清“管理员-审核失物认领”“用户-提交物品挂失”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听20分钟还没get到逻辑)
  • 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“失物照片必填”“认领申请需填详情”“物品状态仅支持待认领/已认领/已作废”),编码时对着做,不会跑偏

3. 可行性分析别敷衍!3点写清楚就能过

导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个核心角度写,显得专业:

  • 技术可行性:Java、SSM框架、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《MySQL数据库设计》,遇到问题能查资料(别用Vue3!我当初想试,前后端联调卡了一周,换回JSP才顺利)
  • 经济可行性:所有工具全免费!MyEclipse(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
  • 操作可行性:界面参考主流失物招领平台,按钮布局简洁,我找同学测试,3分钟就学会查失物、提交认领,导师直接认可

二、技术选型别跟风!这套组合稳到爆

刚开始我跟风用Java+Vue3+Redis,结果“失物收藏缓存”卡了5天——Redis的持久化配置没设对,重启后用户收藏记录全丢😫 后来换成Java 8+SSM+MySQL8.0+Tomcat9+MyEclipse+JSP,新手友好度拉满,调试效率翻两倍!

1. 技术栈详细对比(附避坑提醒)

宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了5个核心工具的选择理由和坑点,直接抄:

技术工具为啥选它避坑提醒!(重点!)
Java 8语法简洁,支持面向对象编程,学习资料丰富,课堂重点学过别用Java 11+!部分SSM组件对高版本支持差,会出现“API过时”提示
SSM框架Spring+SpringMVC+MyBatis整合,分层清晰,简化数据交互,适合Web开发别自己手动整合!用官方模板或Maven依赖自动引入,手动配容易出“Bean注入失败”
MySQL 8.0支持事务和外键,存失物、用户、认领数据足够用,占内存小,支持utf8mb4编码安装时设“utf8mb4”编码!我当初用默认编码,用户姓名含特殊字符(如“䞍”)乱码,查2小时才解决
Tomcat 9.0和Java、JSP适配最好,支持热部署,启动稳定,极少崩溃别用Tomcat 10!会出现“Servlet API包名变更”,答辩时系统崩了就完了
MyEclipse 2022对Java Web开发支持好,自带SSM插件,调试工具直观,免费开源别更到2023+版本!高版本对老电脑兼容性差,经常卡顿闪退

2. 开发环境搭建(step by step 实操)

很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量,Path中添加“%JAVA_HOME%\bin”,cmd输入“java -version”显示版本即成功
  2. 装MyEclipse 2022:选“Enterprise Edition”,免费够用,首次打开勾选“SSM”“MySQL”插件,自动安装
  3. 装MySQL 8.0:用Navicat管理(可视化工具超方便),新建数据库“shiwuzhaoling_system”,编码设“utf8mb4”,排序规则选“utf8mb4_general_ci”
  4. 配Tomcat 9.0:在MyEclipse中添加服务器,选“Apache Tomcat v9.0”,关联安装路径,启动后访问“http://localhost:8080”看到Tomcat首页即成功
  5. 初始化项目:新建SSM项目,导入MySQL驱动包,配置applicationContext.xml和mybatis-config.xml,关联JSP页面和Controller,测试连接数据库成功即完成初始化

3. 架构图一定要画!答辩加分项

用DrawIO画SSM分层架构图,标清“表现层(JSP)-控制层(Controller)-业务层(Service)-数据访问层(DAO)-数据库(MySQL)”:比如用户点“提交失物认领”→JSP页面传请求→Controller接收→Service校验认领信息→DAO操作数据库→返回结果。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SSM+MySQL”专业多了!

三、数据库设计:别让表关联坑了你

这部分是毕设的“核心骨架”,我当初没关联“失物招领表”和“失物认领表”,查“某件失物的认领记录”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。

1. 核心实体&属性(附ER图绘制技巧)

先确定“实体”(管理员、用户、失物招领、失物认领、物品挂失、公告、论坛),再想“属性”,别漏关键字段!我整理了必做的8张表,直接照着画ER图:

  • 用户表(yonghu):id(主键)、yonghu_name(姓名)、yonghu_phone(手机号)、yonghu_id_number(身份证号,唯一)、yonghu_photo(头像路径)、create_time(创建时间)
  • 失物招领表(shiwuzhaoling):id(主键)、yonghu_id(关联用户)、shiwuzhaoling_name(物品名称)、shiwuzhaoling_types(物品类型)、shiwuzhaoling_photo(物品照片路径)、shiwuzhaoling_time(拾遗时间)、shiwuzhaoling_dizhi(拾遗地址)、status_types(物品状态:0=待认领,1=已认领)
  • 失物认领表(shiwurenling):id(主键)、shiwuzhaoling_id(关联失物招领)、yonghu_id(关联用户)、shiwurenling_text(认领详情)、yesno_types(审核状态:0=未审核,1=已通过,2=已拒绝)、insert_time(认领时间)
  • 物品挂失表(wupinguashi):id(主键)、yonghu_id(关联用户)、wupinguashi_name(物品名称)、wupinguashi_types(物品类型)、wupinguashi_photo(物品照片路径)、wupinguashi_time(丢失时间)、wupinguashi_dizhi(丢失地址)

画ER图用Visio或亿图,记住3个规则:

  1. 矩形代表“实体”(比如“失物招领”“失物认领”)
  2. 椭圆代表“属性”(比如失物招领的“物品名称”“拾遗地址”)
  3. 菱形代表“关系”(比如“失物招领-失物认领”是一对多,一件失物可被多个用户认领;“用户-物品挂失”是一对多,一个用户可挂失多件物品) 避坑提醒:别把“失物照片、用户头像”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/photo/shiwu1.jpg)才对。

2. 数据库物理设计(附建表SQL示例)

ER图画好后,转成实际表,字段类型和约束别瞎设!比如“物品状态”用INT(0=待认领,1=已认领),“手机号”用VARCHAR(11),“身份证号”设UNIQUE约束,避免重复。

给宝子们贴“失物招领表”和“失物认领表”的建表SQL,复制到Navicat就能用:

-- 失物招领表
CREATE TABLE `shiwuzhaoling` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '失物ID',
  `yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
  `shiwuzhaoling_uuid_number` VARCHAR(50) DEFAULT NULL COMMENT '失物编号(唯一)',
  `shiwuzhaoling_name` VARCHAR(200) NOT NULL COMMENT '物品名称',
  `shiwuzhaoling_types` INT DEFAULT NULL COMMENT '物品类型(1-证件,2-电子设备,3-随身物品)',
  `status_types` INT DEFAULT 0 COMMENT '物品状态(0=待认领,1=已认领)',
  `shiwuzhaoling_photo` VARCHAR(200) DEFAULT NULL COMMENT '物品照片路径',
  `shiwuzhaoling_time` DATE DEFAULT NULL COMMENT '拾遗时间',
  `shiwuzhaoling_dizhi` VARCHAR(200) DEFAULT NULL COMMENT '拾遗地址',
  `shiwuzhaoling_content` TEXT DEFAULT NULL COMMENT '物品详情',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_shiwu_uuid` (`shiwuzhaoling_uuid_number`),
  KEY `fk_yonghu_shiwu` (`yonghu_id`),
  CONSTRAINT `fk_yonghu_shiwu` FOREIGN KEY (`yonghu_id`) REFERENCES `yonghu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='失物招领表';

-- 失物认领表
CREATE TABLE `shiwurenling` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '认领ID',
  `shiwuzhaoling_id` INT DEFAULT NULL COMMENT '关联失物ID(外键)',
  `yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
  `yesno_types` INT DEFAULT 0 COMMENT '审核状态(0=未审核,1=已通过,2=已拒绝)',
  `shiwurenling_text` TEXT DEFAULT NULL COMMENT '认领详情',
  `insert_time` DATE DEFAULT NULL COMMENT '认领时间',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `fk_shiwu_renling` (`shiwuzhaoling_id`),
  KEY `fk_yonghu_renling` (`yonghu_id`),
  CONSTRAINT `fk_shiwu_renling` FOREIGN KEY (`shiwuzhaoling_id`) REFERENCES `shiwuzhaoling` (`id`),
  CONSTRAINT `fk_yonghu_renling` FOREIGN KEY (`yonghu_id`) REFERENCES `yonghu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='失物认领表';

3. 表关联测试!别等编码才发现错

建完表一定要测关联!比如在“失物认领表”插数据(失物ID=1,用户ID=1,认领详情=“这是我的身份证”),用JOIN查询“某件失物的所有认领记录”:

SELECT u.yonghu_name, u.yonghu_phone, r.shiwurenling_text, 
       r.insert_time, r.yesno_types, s.shiwuzhaoling_name
FROM shiwurenling r
JOIN yonghu u ON r.yonghu_id = u.id
JOIN shiwuzhaoling s ON r.shiwuzhaoling_id = s.id
WHERE s.id = 1;

如果能查出“用户名+手机号+认领详情+认领时间+审核状态+失物名称”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。

四、功能实现:核心模块操作+页面设计

不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。

1. 管理员端:失物认领审核模块(必做!)

这是管理员的核心功能,实现“查看认领申请+审核状态+反馈结果”,重点说“审核状态同步”和“认领详情校验”——别漏这两步,我当初就是这里踩了大坑!

(1)关键操作逻辑
  1. 审核认领前,校验“认领详情非空”(为空提示“请完善认领详情后再提交审核”);
  2. 审核通过时,自动同步失物招领表的“物品状态”为“已认领”,避免重复认领;
  3. 审核拒绝时,必填拒绝理由,方便用户了解未通过原因。
(2)页面设计要点(JSP+Bootstrap)

页面标题:管理员-失物认领审核页面
(插入图片位置:此处放“失物认领审核页面截图”,需包含以下元素)

  • 筛选区:
    • 输入框:失物名称(模糊查)、认领用户(模糊查)
    • 下拉框:审核状态(全部/未审核/已通过/已拒绝)
    • 按钮:“查询”(蓝色btn-primary)、“批量审核”(紫色btn-info)
  • 认领列表区:
    • 表格列名:失物编号、物品名称、认领用户、认领时间、认领详情、审核状态、操作
    • 状态显示:未审核标黄色/已通过标绿色/已拒绝标红色
    • 操作按钮:未审核显示“通过”“拒绝”,已审核显示“查看详情”
  • 审核弹窗:
    • 只读信息:失物名称、认领用户、认领时间、认领详情
    • 填写项:审核结果(单选“通过”“拒绝”)、拒绝理由(文本域,拒绝时必填)
    • 按钮:“提交审核”(绿色)、“取消”(灰色)
(3)避坑提醒
  • 审核状态同步与详情校验!加逻辑:
    // 校验认领详情
    if (StringUtils.isEmpty(renling.getShiwurenlingText())) {
        return Result.error("认领详情不能为空,请完善后再审核!");
    }
    // 审核通过
    if (result == 1) {
        renling.setYesnoTypes(1);
        // 同步失物状态为“已认领”
        Shiwuzhaoling shiwu = shiwuService.getById(renling.getShiwuzhaolingId());
        shiwu.setStatusTypes(1);
        shiwuService.updateById(shiwu);
    } else {
        // 审核拒绝,校验拒绝理由
        if (StringUtils.isEmpty(refuseReason)) {
            return Result.error("拒绝认领需填写拒绝理由!");
        }
        renling.setYesnoTypes(2);
        renling.setRefuseReason(refuseReason);
    }
    renlingService.updateById(renling);
    return Result.success("审核完成!");
    

2. 用户端:失物招领提交模块(核心需求!)

用户用系统的核心是“发布失物信息”,流程别复杂:填写失物信息→上传失物照片→选择拾遗时间和地址→提交,我当初漏了“失物照片必填校验”,导致用户提交空照片的失物,信息无效,补了半天才好。

(1)关键操作逻辑
  1. 提交招领前,校验“物品名称非空”“失物照片已上传”“拾遗时间≤当前日期”(缺一项提示对应错误);
  2. 自动生成唯一“失物编号”(格式:SW+日期+随机数),方便后续查询;
  3. 提交成功后,默认物品状态为“待认领”,同步显示“失物招领发布成功,等待他人认领”提示。
(2)页面设计要点(JSP+Bootstrap)

页面标题:用户-失物招领提交页面
(插入图片位置:此处放“失物招领提交页面截图”,需包含以下元素)

  • 招领表单区:
    • 表单元素:物品名称(输入框,必填)、物品类型(下拉框:证件/电子设备/随身物品,必填)、失物照片(上传框,必填,支持JPG/PNG)、拾遗时间(日期选择器,禁用未来日期,必填)、拾遗地址(输入框,必填)、物品详情(文本域)
    • 按钮:“提交招领”(绿色btn-success)、“重置”(灰色btn-default)
  • 我的招领区(折叠面板):
    • 标题:“我的失物招领记录”(点击展开)
    • 表格列名:失物编号、物品名称、物品类型、拾遗时间、物品状态、操作
    • 操作按钮:“查看详情”“编辑”(仅待认领状态显示)
(3)避坑提醒
  • 失物照片与时间校验!加逻辑:
    // 校验失物照片
    MultipartFile file = shiwu.getShiwuzhaolingPhotoFile();
    if (file == null || file.isEmpty()) {
        return Result.error("请上传失物照片!");
    }
    String fileName = file.getOriginalFilename();
    if (!fileName.endsWith(".jpg") && !fileName.endsWith(".png")) {
        return Result.error("仅支持JPG、PNG格式照片,请重新上传!");
    }
    // 校验拾遗时间
    Date shiwuTime = shiwu.getShiwuzhaolingTime();
    if (shiwuTime.after(new Date())) {
        return Result.error("拾遗时间不能晚于当前日期,请重新选择!");
    }
    // 生成唯一失物编号
    String uuid = "SW" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + RandomUtils.nextInt(1000, 9999);
    shiwu.setShiwuzhaolingUuidNumber(uuid);
    // 保存照片(示例路径)
    String savePath = "D:/shiwuzhaoling/photo/";
    File saveFile = new File(savePath + fileName);
    file.transferTo(saveFile);
    shiwu.setShiwuzhaolingPhoto("/static/photo/" + fileName);
    // 提交招领
    shiwu.setStatusTypes(0); // 0=待认领
    shiwuService.save(shiwu);
    return Result.success("失物招领发布成功,等待他人认领!");
    

3. 管理员端:公告管理模块(答辩亮点!)

这个功能能体现“平台信息同步能力”,导师超爱问!核心是“发布公告-修改公告-删除失效公告”,别漏“公告类型分类”,不然用户找不到关键通知。

页面设计要点(JSP+Bootstrap)

页面标题:管理员-公告管理页面
(插入图片位置:此处放“公告管理页面截图”,需包含以下元素)

  • 筛选区:
    • 输入框:公告名称(模糊查)
    • 下拉框:公告类型(全部/系统通知/招领须知)
    • 按钮:“查询”(蓝色)、“新增公告”(绿色)
  • 公告列表区:
    • 表格列名:公告名称、公告类型、公告图片、发布时间、操作
    • 操作按钮:“查看详情”(蓝色)、“编辑”(橙色)、“删除”(红色)
  • 新增公告弹窗:
    • 表单元素:公告名称(必填)、公告类型(下拉框,必填)、公告图片(上传框,JPG/PNG)、发布时间(日期选择器,默认当前日期)、公告详情(富文本编辑器,必填)
    • 按钮:“提交”(绿色)、“取消”(灰色)
(3)避坑提醒
  • 公告详情富文本编辑器配置!用KindEditor或UEditor,避免纯文本域格式混乱:
    <!-- 引入KindEditor -->
    <script src="${pageContext.request.contextPath}/static/kindeditor/kindeditor-all.js"></script>
    <script>
        // 初始化编辑器
        var editor;
        KindEditor.ready(function(K) {
            editor = K.create('textarea[name="newsContent"]', {
                resizeType: 1,
                allowImageUpload: true,
                imageUploadJson: '${pageContext.request.contextPath}/news/uploadImg',
                items: ['fontname', 'fontsize', 'bold', 'image', 'link', 'unlink', 'source']
            });
        });
    </script>
    <!-- 富文本编辑器 -->
    <textarea name="newsContent" id="newsContent" style="width:100%;height:300px;"></textarea>
    

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、测试别敷衍!这3步让答辩不翻车

很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“拾遗时间选未来日期”场景,导致系统允许无效时间入库,导师说“不符合失物招领逻辑”,当场扣分😫 测试一定要针对性做!

1. 功能测试(必测3个模块)

别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:

(1)失物认领审核测试(表1:认领审核测试用例)
测试场景操作步骤预期结果实际结果测试结论
认领详情为空审核选认领记录→详情为空→点“通过”→提交提示“认领详情不能为空,请完善后再审核!”
拒绝认领不填理由选认领记录→点“拒绝”→不填理由→提交提示“拒绝认领需填写拒绝理由!”
正常审核通过选认领记录→详情完整→点“通过”→提交提示“审核完成!”,失物状态变为“已认领”
(2)失物招领提交测试(表2:招领提交测试用例)
测试场景操作步骤预期结果实际结果测试结论
未上传失物照片填招领信息→不上传照片→提交提示“请上传失物照片!”
拾遗时间选未来填信息→时间选明天→提交提示“拾遗时间不能晚于当前日期,请重新选择!”
正常提交招领填名称+选类型+传照片+选今天→提交提示“失物招领发布成功,等待他人认领!”
(3)公告管理测试(表3:公告测试用例)
测试场景操作步骤预期结果实际结果测试结论
公告详情为空新增填名称+选类型→详情为空→提交提示“公告详情不能为空,请完善后提交!”
正常新增公告填名称+选类型+传图片+写详情→提交提示“公告新增成功!”,列表显示该公告
删除公告选公告→点“删除”→确认删除提示“公告删除成功!”,列表移除该公告

2. 兼容性测试(容易忽略的点)

别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果公告列表表格错乱,赶紧加兼容性CSS才好:

  • 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
  • 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的响应式布局,加“overflow-x: hidden”)

3. 测试报告要写好!答辩加分

把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:

  • 问题总结:“IE浏览器下公告列表错乱,通过添加IE专属CSS(*zoom: 1;)修复;失物招领未来时间能提交,加时间校验修复”
  • 测试结论:“核心功能(认领审核、招领提交、公告管理)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”

六、答辩准备:3个加分小技巧

毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:

  1. 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“用户提交失物招领→另一用户提交认领→管理员审核通过→失物状态更新”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始失物认领详情为空能审核,加非空校验解决;重复认领无法拦截,同步失物状态为已认领修复;表关联错误导致查询失败,重新设计外键解决”,比光说“我用了SSM+MySQL”有亮点
  3. 准备常见问题:导师大概率问“为啥选SSM不选Spring Boot”“数据多了怎么优化”,提前答:“SSM分层清晰,适合理解Web开发流程;数据多就加索引(如失物招领表的shiwuzhaoling_types和status_types联合索引),优化查询速度,还能分表存储历史失物数据”

最后:毕设通关的小私心

以上就是基于Java+SSM的失物招领平台从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。

需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“失物招领平台”,我私发你;卡在某个模块(比如认领审核、招领提交),也可以留言,我看到必回!

点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘