大家好,我是Java1234_小锋老师,分享一套锋哥原创的微信小程序校园失物招领管理系统(SpringBoot4+Vue3) 。

项目介绍
校园生活中,学生证、校园卡、雨伞、耳机等物品丢失较为常见。传统失物招领主要依赖公告栏张贴、班级群转发和口头转告,信息分散、时效性差,拾到者与失主难以建立可信的对接渠道,管理人员也无法对认领过程进行规范审核和数据统计。随着移动互联网和智慧校园建设的推进,利用微信小程序提供“随手可及”的失物招领服务,已成为提升校园公共服务效率的可行路径。
本文设计并实现了一套微信小程序校园失物招领管理系统。系统采用前后端分离架构:学生端基于微信小程序原生框架开发,提供用户名密码登录、注册、招领浏览、寻物浏览、信息发布、在线认领、公告查看、留言反馈和个人中心等功能;管理端基于 Vue 3、Vite、Pinia、Element Plus 和 ECharts 构建,提供数据统计、用户管理、分类管理、招领管理、寻物管理、认领审核、公告管理、反馈回复以及个人中心等功能;服务端基于 Java 17 与 Spring Boot 4.1 构建 RESTful API,使用 MyBatis-Plus 访问 MySQL 8 数据库 db_lost_found,并结合 JWT 完成身份认证与接口鉴权。
在需求分析阶段,论文从可行性、功能需求和非功能需求三个方面论证了系统建设的必要性,给出了用例模型。在设计阶段,论文给出了分层架构、功能结构、时序交互和数据库设计。其中 E-R 图分为两部分:第一部分以独立实体属性图描述管理员、学生用户、物品分类、寻物启事、失物招领、认领申请、系统公告和留言反馈等实体;第二部分给出实体之间的联系及基数。数据表设计以表格形式列出了每个字段的名称、类型、长度、是否为空和备注。在实现阶段,论文结合项目真实代码说明了登录注册、信息发布、认领审核、公告反馈、首页统计和个人中心等核心模块的实现方法。测试结果表明,系统能够完成校园失物招领业务闭环,界面日期时间显示规范,具有较好的可用性与可维护性。
源码下载
链接: https://pan.baidu.com/s/1OEcTMVzcDHQMQYA96pv0jg?pwd=1234 提取码: 1234
系统展示 







核心代码
package com.java1234.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.java1234.common.PageResult;
import com.java1234.entity.Feedback;
import com.java1234.mapper.FeedbackMapper;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 留言反馈业务服务
*/
@Service
public class FeedbackService {
private final FeedbackMapper feedbackMapper;
/**
* 构造反馈服务
*
* @param feedbackMapper 反馈Mapper
*/
public FeedbackService(FeedbackMapper feedbackMapper) {
this.feedbackMapper = feedbackMapper;
}
/**
* 分页查询反馈
*
* @param pageNum 页码
* @param pageSize 每页条数
* @param status 状态
* @param userId 用户ID
* @return 分页结果
*/
public PageResult<Feedback> page(Integer pageNum, Integer pageSize, Integer status, Integer userId) {
Page<Feedback> page = new Page<>(pageNum, pageSize);
IPage<Feedback> result = feedbackMapper.selectPageList(page, status, userId);
return new PageResult<>(result.getTotal(), result.getRecords());
}
/**
* 提交反馈
*
* @param feedback 反馈信息
*/
public void save(Feedback feedback) {
feedback.setStatus(0);
feedback.setCreateTime(LocalDateTime.now());
feedbackMapper.insert(feedback);
}
/**
* 管理员回复反馈
*
* @param feedback 回复信息
*/
public void reply(Feedback feedback) {
Feedback update = new Feedback();
update.setId(feedback.getId());
update.setReply(feedback.getReply());
update.setStatus(1);
update.setReplyTime(LocalDateTime.now());
feedbackMapper.updateById(update);
}
/**
* 删除反馈
*
* @param id 反馈ID
*/
public void delete(Integer id) {
feedbackMapper.deleteById(id);
}
}
<view class="page">
<view class="card">
<view class="detail-header">
<view class="detail-title">{{detail.title}}</view>
<button wx:if="{{detail.status === 0}}" class="btn btn-primary claim-btn" bindtap="openClaim">申请认领</button>
</view>
<view class="kv"><text>物品名称</text><text>{{detail.itemName}}</text></view>
<view class="kv"><text>状态</text><text>{{detail.statusText}}</text></view>
<view class="kv"><text>拾取地点</text><text>{{detail.foundPlace}}</text></view>
<view class="kv"><text>拾取时间</text><text>{{detail.foundTimeText}}</text></view>
<view class="kv"><text>暂存地点</text><text>{{detail.storagePlace}}</text></view>
<view class="kv"><text>联系人</text><text>{{detail.contactName}} {{detail.contactPhone}}</text></view>
<view class="kv col"><text>描述</text><text>{{detail.description}}</text></view>
<image wx:if="{{detail.imageUrl}}" class="detail-img" src="{{detail.imageUrl}}" mode="widthFix"></image>
</view>
<view class="mask" wx:if="{{showClaim}}" bindtap="closeClaim"></view>
<view class="dialog" wx:if="{{showClaim}}">
<view class="dialog-title">申请认领</view>
<textarea placeholder="请填写认领说明" value="{{claimReason}}" bindinput="onReason"></textarea>
<button class="btn btn-plain" bindtap="chooseEvidence">上传凭证图片</button>
<image wx:if="{{evidenceUrl}}" class="evidence" src="{{evidenceUrl}}" mode="aspectFill"></image>
<view class="dialog-actions">
<button class="btn btn-plain" bindtap="closeClaim">取消</button>
<button class="btn btn-primary" bindtap="submitClaim">提交</button>
</view>
</view>
</view>


