基于SpringBoot2+vue2的流浪宠物管理系统
温馨提示:
本文最后更新于 2026年05月28日,已超过 13 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
1. 资源
浏览全文可获取
2. 项目简介
流浪宠物管理系统是一个基于Spring Boot和MyBatis Plus框架开发的Web应用系统。该系统旨在为流浪宠物提供一个集信息展示、领养申请、公益救助和配套商品销售于一体的综合管理平台。
系统主要包含两大模块:
- 前台用户端:面向普通用户,提供流浪宠物查看与领养、流浪动物救助故事浏览与互动(点赞/踩、留言、收藏)、宠物用品在线商城(购物车、下单、支付、评价)、公告通知查看以及个人中心(信息管理、地址管理、订单管理、收藏管理)等功能。
- 后台管理端:面向管理员,提供对系统基础数据(用户、流浪宠物、商品、公告、轮播图等)的维护,对领养申请的审核,以及对商品订单的处理(发货、退款等)等功能。
3. 技术栈
| 层级 | 技术/框架 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.2.2.RELEASE | 项目的基础框架,提供自动配置和快速开发能力。 |
| 持久层 | MyBatis Plus 2.3 | 增强的MyBatis ORM框架,简化数据库操作。 |
| 安全控制 | Apache Shiro 1.3.2 | 用于身份认证和权限管理。 |
| 数据库 | MySQL 5.7.32-log | 关系型数据库,存储系统业务数据。 |
| 前端框架 | Vue.js (后台管理) layui (前台) |
后台管理使用Vue + Element UI构建SPA;前台使用layui和jQuery。 |
| 前端组件 | Element UI, ECharts, Axios, Swiper | 丰富用户界面交互和数据可视化。 |
| 工具库 | Fastjson, Hutool, Commons-lang3 | 用于JSON处理、工具方法、字符串操作等。 |
4. 详细介绍
4.1 核心功能模块
流浪宠物管理
- 用户端:用户可以浏览所有流浪宠物列表,并通过“宠物类型”和“认领状态”进行筛选。点击宠物可查看详细信息,并可在线提交领养申请。
- 管理端:管理员可以对流浪宠物信息进行增删改查操作,并审核用户提交的领养申请。
宠物用品商城
- 用户端:用户可浏览商品列表,支持按类型筛选。商品详情页支持“加入购物车”和“立即购买”。用户可在购物车中修改商品数量、删除商品并统一下单。下单时需选择收货地址,并可选择支付方式(如余额支付)。用户可在“我的订单”中查看订单状态(待支付、已支付、已发货、已收货、已评价),并执行“支付”、“收货”、“评价”、“退款”等操作。
- 管理端:管理员可以对商品进行增删改查和上下架管理,处理订单的发货和退款流程。
流浪动物救助
- 用户端:用户可以浏览发布的流浪动物救助故事,并参与互动。可对救助故事进行“点赞”或“点踩”,发表留言评论,以及收藏感兴趣的救助故事。
- 管理端:管理员可以对救助故事进行管理,并回复用户的留言。
公告信息管理
- 用户端:用户可以查看系统发布的各类公告新闻。
- 管理端:管理员可以发布、修改和删除公告信息。
用户中心
- 用户可以注册/登录系统,修改个人信息、头像和密码。
- 用户可以管理自己的收货地址(增删改查,设置默认地址)。
- 用户可以在“我的订单”中查看所有历史订单,并进行后续操作。
- 用户可以在“我的收藏”中查看自己收藏的救助故事。
4.2 数据库设计
- 用户相关:
yonghu(用户),users(管理员) - 核心业务:
chongwu(流浪宠物),chongwu_lingyang(流浪宠物领养申请),liulangdongwujiuzhu(流浪动物救助),chongwuyongpin(商品) - 交易相关:
cart(购物车),chongwuyongpin_order(商品订单),address(送货地址) - 交互相关:
liulangdongwujiuzhu_liuyan(救助留言),liulangdongwujiuzhu_collection(救助收藏),chongwuyongpin_commentback(商品评价) - 基础数据:
dictionary(字典表,用于存储各类下拉选项),config(轮播图配置),news(公告信息)
4.3 系统架构与设计
- 后端架构:采用经典的三层架构(Controller - Service - Dao)。Controller层处理HTTP请求,Service层实现业务逻辑,Dao层通过MyBatis Plus与数据库交互。
- 权限控制:使用Shiro框架进行用户认证与授权。并通过自定义的
@IgnoreAuth注解和AuthorizationInterceptor拦截器实现对API接口的Token验证。 - 数据字典:通过
dictionary表和DictionaryServletContextListener监听器,将字典数据在项目启动时加载到全局ServletContext中,并在DictionaryService中提供通用的字典值转换方法,提高系统效率和数据一致性。 - 前后端分离:后台管理采用Vue.js SPA模式,与后端通过JSON格式的RESTful API进行通信。
- 工具类:项目中包含了丰富的工具类,如用于数据校验的
ValidatorUtils、用于SQL防注入的SQLFilter、用于Excel处理的PoiUtil等,提高了代码的复用性和安全性。
5. 部分代码
5.1 流浪宠物实体类 (ChongwuEntity.java)
这是流浪宠物表对应的实体类,用于封装数据库中的一条记录。
// 部分关键代码展示
package com.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@TableName("chongwu")
public class ChongwuEntity<T> implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(value = "chongwu_name")
private String chongwuName; // 宠物名称
@TableField(value = "chongwu_photo")
private String chongwuPhoto; // 宠物照片
@TableField(value = "chongwu_types")
private Integer chongwuTypes; // 宠物类型 (关联字典表)
@TableField(value = "chongwu_status_types")
private Integer chongwuStatusTypes; // 认领状态 (关联字典表)
@TableField(value = "chongwu_content")
private String chongwuContent; // 宠物简介
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime; // 创建时间
// ... 省略 getter 和 setter 方法 ...
}
5.2 流浪宠物控制器 (ChongwuController.java)
展示了后端如何处理前端关于“流浪宠物”的请求。
// 部分关键代码展示
package com.controller;
import com.entity.ChongwuEntity;
import com.service.ChongwuService;
import com.utils.PageUtils;
import com.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/chongwu")
public class ChongwuController {
@Autowired
private ChongwuService chongwuService;
// 前端列表查询接口
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params) {
// 处理分页和查询参数
PageUtils page = chongwuService.queryPage(params);
// 返回分页数据
return R.ok().put("data", page);
}
// 前端详情查询接口,同时增加点击次数
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id) {
ChongwuEntity chongwu = chongwuService.selectById(id);
if (chongwu != null) {
// 点击数量加1
chongwu.setChongwuClicknum(chongwu.getChongwuClicknum() + 1);
chongwuService.updateById(chongwu);
// ... 省略数据转换 ...
return R.ok().put("data", chongwu);
} else {
return R.error(511, "查不到数据");
}
}
// ... 省略其他方法 ...
}
5.3 MyBatis Plus 映射文件 (ChongwuDao.xml)
展示了如何实现复杂的多表联查,此例中为chongwu表关联dictionary表查询chongwu_types和chongwu_status_types对应的具体值,以便在前端展示。
<!-- 部分关键代码展示 -->
<mapper namespace="com.dao.ChongwuDao">
<sql id="Base_Column_List">
a.id as id
,a.chongwu_name as chongwuName
,a.chongwu_photo as chongwuPhoto
-- ... 其他基础字段
</sql>
<select id="selectListView" parameterType="map" resultType="com.entity.view.ChongwuView">
SELECT
<include refid="Base_Column_List" />
, b.index_name as chongwuValue
, c.index_name as chongwuStatusValue
FROM chongwu a
LEFT JOIN dictionary b ON a.chongwu_types = b.code_index AND b.dic_code = 'chongwu_types'
LEFT JOIN dictionary c ON a.chongwu_status_types = c.code_index AND c.dic_code = 'chongwu_status_types'
<where>
<if test="params.ids != null"> ... </if>
<if test=" params.chongwuName != null and params.chongwuName != '' ">
and a.chongwu_name like CONCAT('%',#{params.chongwuName},'%')
</if>
<!-- ... 其他查询条件 -->
</where>
order by a.${params.orderBy} desc
</select>
</mapper>
5.4 商品订单处理逻辑 (ChongwuyongpinOrderController.java)
这是系统的核心业务逻辑之一,处理用户下单过程,涉及库存扣减、金额计算、余额校验、订单生成等多个操作,并通过数据库事务保证数据一致性。
// 部分关键代码展示
@RestController
@RequestMapping("/chongwuyongpinOrder")
public class ChongwuyongpinOrderController {
@Autowired
private ChongwuyongpinOrderService chongwuyongpinOrderService;
@Autowired
private ChongwuyongpinService chongwuyongpinService;
@Autowired
private YonghuService yonghuService;
@Autowired
private CartService cartService;
@RequestMapping("/order")
public R add(@RequestParam Map<String, Object> params, HttpServletRequest request) {
// 1. 获取订单参数:地址ID、支付方式、商品列表等
Integer userId = (Integer) request.getSession().getAttribute("userId");
// ...
// 2. 遍历购物车商品,逐一处理
for (Map<String, Object> map : chongwuyongpins) {
ChongwuyongpinEntity chongwuyongpinEntity = chongwuyongpinService.selectById(chongwuyongpinId);
// 3. 校验库存
if(chongwuyongpinEntity.getChongwuyongpinKucunNumber() < buyNumber) {
return R.error(chongwuyongpinEntity.getChongwuyongpinName()+"的库存不足");
}
// 4. 更新库存
chongwuyongpinEntity.setChongwuyongpinKucunNumber(chongwuyongpinEntity.getChongwuyongpinKucunNumber() - buyNumber);
// 5. 计算价格,并校验用户余额是否充足
if(chongwuyongpinOrderPaymentTypes == 1) { // 余额支付
if(yonghuEntity.getNewMoney() - money < 0 ) {
return R.error("余额不足,请充值!!!");
}
// 扣减余额
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() - money);
}
// 创建订单详情对象...
}
// 6. 批量插入订单、更新商品库存、更新用户余额、清空购物车
chongwuyongpinOrderService.insertBatch(chongwuyongpinOrderList);
chongwuyongpinService.updateBatchById(chongwuyongpinList);
yonghuService.updateById(yonghuEntity);
cartService.deleteBatchIds(cartIds);
return R.ok();
}
// ... 其他方法 ...
}
5.5 前端页面 - 商品详情与购买 (chongwuyongpin/detail.html)
展示了前台用户端商品详情页的核心交互逻辑:数量选择器和加入购物车功能。
<!-- 部分关键代码展示 -->
<div class="detail-item">
<!-- 数量加减按钮 -->
<button type="button" @click="buyNumber>0?buyNumber--:buyNumber">-</button>
<input type="number" v-model="buyNumber" id="buyNumber" disabled="disabled" />
<button type="button" @click="buyNumber++">+</button>
<!-- 加入购物车按钮 -->
<button @click="addChongwuyongpinCart()" type="button">
添加到购物车
</button>
</div>
<script>
// ... 省略Vue实例定义 ...
methods: {
// 添加到购物车方法
addChongwuyongpinCart() {
// 1. 检查库存
if (this.detail.chongwuyongpinKucunNumber < this.buyNumber) {
layui.layer.msg(`库存不足`, { icon: 5 });
return false;
}
// 2. 检查购物车是否已存在该商品
layui.http.request('cart/list', 'get', {
yonghuId: localStorage.getItem('userid'),
chongwuyongpinId: this.detail.id,
}, (res) => {
if(res.data.list.length > 0) {
layui.layer.msg("该商品已经添加到购物车", { icon: 5 });
return false;
}
// 3. 发起请求,将商品加入购物车
layui.http.requestJson('cart/add', 'post', {
yonghuId: localStorage.getItem('userid'),
chongwuyongpinId: this.detail.id,
buyNumber: this.buyNumber,
}, (res) => {
if(res.code==0){
layui.layer.msg('添加到购物车成功', { icon: 6 });
}
});
});
}
}
</script>
6. 部分截图









































7. 项目总结
该项目是一个功能较为完整的流浪宠物管理与公益救助平台,涵盖了信息发布、互动交流和在线商城等多个维度。
优点:
- 功能全面:集成了流浪宠物领养、公益救助、电商购物、信息公告等核心模块,形成业务闭环。
- 结构清晰:后端采用主流的分层架构,前后端分离,代码组织良好,职责明确。
- 技术实用:选用了Spring Boot、MyBatis Plus、Vue等业界成熟且流行的技术栈,具有良好的可维护性和扩展性。
- 交互完善:前台提供了丰富的用户交互,如点赞/踩、留言、收藏、购物车、订单管理等,用户体验较好。
- 系统设计:利用数据字典、统一拦截器、全局异常处理等设计,提高了代码复用性和系统的健壮性。
正文到此结束
- 本文标签: Java Spring Spring Boot
- 本文链接: https://blog.xiaobias.com/article/8
- 版权声明: 本文由十五喵原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
