原创

基于SpringBoot2+vue2的流浪宠物管理系统

温馨提示:
本文最后更新于 2026年05月28日,已超过 13 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1. 资源

浏览全文可获取


2. 项目简介

流浪宠物管理系统是一个基于Spring Boot和MyBatis Plus框架开发的Web应用系统。该系统旨在为流浪宠物提供一个集信息展示、领养申请、公益救助和配套商品销售于一体的综合管理平台。

系统主要包含两大模块:

  1. 前台用户端:面向普通用户,提供流浪宠物查看与领养、流浪动物救助故事浏览与互动(点赞/踩、留言、收藏)、宠物用品在线商城(购物车、下单、支付、评价)、公告通知查看以及个人中心(信息管理、地址管理、订单管理、收藏管理)等功能。
  2. 后台管理端:面向管理员,提供对系统基础数据(用户、流浪宠物、商品、公告、轮播图等)的维护,对领养申请的审核,以及对商品订单的处理(发货、退款等)等功能。

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 核心功能模块

  1. 流浪宠物管理

    • 用户端:用户可以浏览所有流浪宠物列表,并通过“宠物类型”和“认领状态”进行筛选。点击宠物可查看详细信息,并可在线提交领养申请。
    • 管理端:管理员可以对流浪宠物信息进行增删改查操作,并审核用户提交的领养申请。
  2. 宠物用品商城

    • 用户端:用户可浏览商品列表,支持按类型筛选。商品详情页支持“加入购物车”和“立即购买”。用户可在购物车中修改商品数量、删除商品并统一下单。下单时需选择收货地址,并可选择支付方式(如余额支付)。用户可在“我的订单”中查看订单状态(待支付、已支付、已发货、已收货、已评价),并执行“支付”、“收货”、“评价”、“退款”等操作。
    • 管理端:管理员可以对商品进行增删改查和上下架管理,处理订单的发货和退款流程。
  3. 流浪动物救助

    • 用户端:用户可以浏览发布的流浪动物救助故事,并参与互动。可对救助故事进行“点赞”或“点踩”,发表留言评论,以及收藏感兴趣的救助故事。
    • 管理端:管理员可以对救助故事进行管理,并回复用户的留言。
  4. 公告信息管理

    • 用户端:用户可以查看系统发布的各类公告新闻。
    • 管理端:管理员可以发布、修改和删除公告信息。
  5. 用户中心

    • 用户可以注册/登录系统,修改个人信息、头像和密码。
    • 用户可以管理自己的收货地址(增删改查,设置默认地址)。
    • 用户可以在“我的订单”中查看所有历史订单,并进行后续操作。
    • 用户可以在“我的收藏”中查看自己收藏的救助故事。

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_typeschongwu_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. 部分截图

img1
img2
img3
img4
img5
img6
img7
img8
img9
img10
img11
img12
img13
img14
img15
img16
img17
img18
img19
img20
img21
img22
img23
img24
img25
img26
img27
img28
img29
img30
img31
img32
img33
img34
img35
img36
img37
img38
img39
img40
img41


7. 项目总结

该项目是一个功能较为完整的流浪宠物管理与公益救助平台,涵盖了信息发布、互动交流和在线商城等多个维度。

优点:

  • 功能全面:集成了流浪宠物领养、公益救助、电商购物、信息公告等核心模块,形成业务闭环。
  • 结构清晰:后端采用主流的分层架构,前后端分离,代码组织良好,职责明确。
  • 技术实用:选用了Spring Boot、MyBatis Plus、Vue等业界成熟且流行的技术栈,具有良好的可维护性和扩展性。
  • 交互完善:前台提供了丰富的用户交互,如点赞/踩、留言、收藏、购物车、订单管理等,用户体验较好。
  • 系统设计:利用数据字典、统一拦截器、全局异常处理等设计,提高了代码复用性和系统的健壮性。

自助获取:https://fifteen.xiaobias.com/source/209

正文到此结束