一、模块职责介绍
本次实训我独立负责失物信息管理核心模块,是整个失物招领系统的核心业务模块。模块实现功能:失物信息发布、全量列表查询、物品找回状态修改、失物记录删除;配套图片上传存储,删除记录时同步清理服务器本地图片,避免磁盘冗余文件。下文完整拆解实体类、持久层、接口业务代码与业务逻辑。
二、数据库实体 LostItem.java
java
运行
package com.hlw.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDate; @Data @TableName("lost_item") public class LostItem { @TableId(type = IdType.AUTO) private Integer id; // 主键ID,自增 private String itemName; // 丢失物品名称 private String location; // 丢失地点 private LocalDate lostDate; // 丢失日期 private String desc; // 物品详细描述 private String imgUrl; // 上传图片访问路径 private Integer status; // 状态:0未找回 1已找回 }注解说明
@TableName("lost_item"):绑定数据库对应数据表;@TableId(type = IdType.AUTO):设置主键自增;@Data:Lombok 注解,自动生成 get、set、toString 等方法,简化代码;- status 状态字段区分物品找回状态,前端页面用不同标签样式展示。
三、持久层 Mapper LostItemMapper.java
java
运行
package com.hlw.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hlw.entity.LostItem; import org.apache.ibatis.annotations.Mapper; @Mapper public interface LostItemMapper extends BaseMapper<LostItem> { // MyBatis-Plus内置基础CRUD方法:selectList、insert、updateById、deleteById,无需手写SQL }继承 BaseMapper 后,框架自带全套单表操作方法,不用手动编写增删改查 SQL,大幅提升开发效率。
四、核心接口业务代码(Controller 写在启动类 DemoApplication)
java
运行
import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.List; import java.util.UUID; // 1. 查询全部失物列表 @GetMapping("/api/lost/list") public R<List<LostItem>> getLostList(){ List<LostItem> list = lostItemMapper.selectList(null); return R.success(list); } // 2. 新增发布失物(携带图片上传) @PostMapping("/api/lost/add") public R<String> addLostItem(LostItem lostItem, @RequestParam("file") MultipartFile file) throws IOException { // 1. 生成全局唯一图片文件名,防止多人上传同名图片覆盖 String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String fileName = System.currentTimeMillis() + UUID.randomUUID().toString() + suffix; // 2. 判断uploads文件夹是否存在,不存在自动创建目录 File saveFile = new File("uploads/" + fileName); if(!saveFile.getParentFile().exists()){ saveFile.getParentFile().mkdirs(); } // 3. 将图片写入本地文件夹 file.transferTo(saveFile); // 4. 存入图片访问路径,默认状态为未找回 lostItem.setImgUrl("/uploads/" + fileName); lostItem.setStatus(0); lostItemMapper.insert(lostItem); return R.success("发布失物成功"); } // 3. 修改失物找回状态 @PutMapping("/api/lost/update/status/{id}") public R<String> updateLostStatus(@PathVariable Integer id){ LostItem item = lostItemMapper.selectById(id); item.setStatus(1); lostItemMapper.updateById(item); return R.success("状态更新为已找回"); } // 4. 删除失物记录(同步删除本地存储图片) @DeleteMapping("/api/lost/del/{id}") public R<String> delLostItem(@PathVariable Integer id){ LostItem lostItem = lostItemMapper.selectById(id); // 转换图片路径,删除本地物理文件 String imgPath = lostItem.getImgUrl().replace("/uploads/","uploads/"); File imgFile = new File(imgPath); if(imgFile.exists()){ imgFile.delete(); } // 删除数据库记录 lostItemMapper.deleteById(id); return R.success("删除成功"); }五、核心业务逻辑分步讲解
1. 新增失物图片处理逻辑
使用「时间戳 + UUID」拼接图片文件名,从根源解决图片重名覆盖问题;写入文件前自动判断 uploads 目录是否存在,缺失则自动创建,避免文件写入报错;数据库仅存储图片访问路径,前端通过/uploads/文件名直接回显图片,不占用数据库存储空间。
2. 删除联动清理逻辑
单纯删除数据库记录会造成服务器本地大量无效图片堆积,因此业务流程强制要求:先根据 ID 查询图片路径,物理删除本地图片文件,再执行数据库记录删除操作,保证资源同步清理。
3. 物品状态流转逻辑
用户发布失物时默认状态为 0(未找回);当用户找回物品后,调用状态更新接口修改为 1(已找回),前端列表页面通过 status 字段区分展示不同样式标签。
六、功能运行截图说明
- 前端发布失物页面截图:上传图片后提交表单,数据库新增一条失物记录;
- 状态修改功能截图:页面点击标记已找回按钮,接口返回成功,数据库 status 字段更新为 已找回;
- 删除功能截图:执行删除操作后,数据库无该条失物数据。
七、开发过程遇到的逻辑问题与解决方案
- 图片文件名重复覆盖:时间戳 + UUID 组合生成唯一文件名解决;
- 文件夹不存在导致上传报错:新增文件前判断并自动创建父目录;
- 删除图片路径字符串转换异常:统一路径存储规则,数据库存
/uploads/xxx,本地文件路径去掉首斜杠。
八、个人开发心得
本模块开发核心难点是文件 IO 操作与数据库数据联动,不能只实现基础 CRUD 而忽略本地资源清理这类边界场景。MyBatis-Plus 大幅简化了单表数据库操作,让开发重心可以放在真实业务逻辑处理上,非常适合实训小型项目快速迭代开发。