# 3-宠物领养系统 - 功能说明
# 项目概述
宠物领养系统是一个面向流浪与待领养宠物救助场景的前后端分离 Web 应用,围绕「宠物档案管理 → 领养信息发布 → 领养申请与审核 → 寄养/救助信息流转」组织业务,同时提供管理员后台与普通用户前台两套界面。系统后端基于 Django 3.2 + Django REST Framework 3.14 提供 RESTful API,前端基于 Vue 3.4.29 + Element Plus 2.8.4 + Vite 5.3.1 构建单页应用,数据库使用 MySQL(库名 d_3_adoption_system,utf8mb4),认证采用自定义 JWT Token(PyJWT 2.7.0,HS256),并通过 Token 拦截中间件 + 角色类型(type:ADMIN / USER)实现双角色权限分离。
# 项目概览
# ✨ 创新点
# 1. 双角色双界面架构
- 角色由 JWT 承载:登录成功后 Token 的 payload 写入
id、username、type(ADMIN / USER),后续所有请求由中间件解出request.type。 - 两套独立布局:
AdminLayout.vue(后台,左侧管理菜单)与FrontLayout.vue(前台,顶部导航),登录后按type跳转/admin或/。 - 互相隔离:普通用户访问后台会被重定向回前台,管理员访问前台会被重定向回后台。
# 2. 自定义 JWT 认证与 Token 拦截中间件
- 非标准传递方式:Token 通过请求头
token字段传递(TokenInterceptorMiddleware读取HTTP_TOKEN),前端 axios 请求拦截器统一注入。 - 白名单机制:
/common/login、/common/register、/common/retrievePassword等精确路径与/uploads/、/static/、/swagger/、/django-admin/前缀免登录。 - 有效期 30 天:
create_token默认timeout=60*24*30分钟,密钥复用 DjangoSECRET_KEY,算法 HS256;非法或过期 Token 返回code=401由前端跳转登录页。
# 3. 审核驱动的状态流转与业务联动
- 申请审核接口:领养/寄养申请均提供
approve、reject两个动作接口,拒绝时必须填写reject_reason。 - 审核结果自动回写主表:领养申请通过后自动把对应
adoption.adoption_status置为「已领养」;寄养申请通过后自动把对应foster.foster_status置为「已寄养」。 - 前端按状态显隐操作:后台审核页仅在状态为「待审核」时显示「通过 / 拒绝」按钮,并用
el-tag区分状态颜色。
# 4. 逻辑外键 + 序列化器连表展示
- 无物理外键:9 张表之间全部使用
xx_id逻辑关联(如pet.category_id、adoption.pet_id、foster.owner_id、rescue.publisher_id)。 - 序列化器补全名称:
PetSerializer.category_name、AdoptionSerializer.pet_name / pet_breed / pet_image / category_name、FosterSerializer.owner_name、RescueSerializer.publisher_name、AdoptionApplicationSerializer.adoption_title / user_name等通过SerializerMethodField连表查询返回可读名称。
# 5. 统一响应、全局异常与自动时间戳
- 统一响应体:
ResponseMessage提供success / failed / other / jump,固定返回code、msg、data三字段,前端 axios 响应拦截器按code统一提示与跳转。 - 全局异常处理器:
utils/exception_handler.py依次处理自定义异常、Django 内置异常、DRF 异常与未知异常,统一输出标准结构(配合utils/custom_exception.py的 NotFound / PermissionDenied / Unauthorized / Validation / Business 异常)。 - 创建时间自动写入:各模型通过
pre_save信号pre_save_timestamp_handler在新增时自动填充create_time。
# 6. 配套 Java 代码生成器
- 自动化生成:仓库内
CodeGenerator/提供基于 Spring Boot + MyBatis-Plus + Velocity 的生成器(DjangoCodeGenerator、VueCodeGenerator、BatchCodeGenerator)。 - 一键产出:根据数据库表生成 Django 的 models / serializer / views / urls 与 Vue3 管理页面模板(
page.vue.vm),并自动注册到settings.py、urls.py、前端路由与后台菜单。
# ✨ 项目亮点
# 一、 业务功能亮点
- 完整的领养闭环:从宠物档案建档、发布领养信息、用户提交领养申请,到管理员审核通过后自动把领养信息置为「已领养」,全流程可追溯。
- 寄养服务双向撮合:用户可发布寄养需求(含寄养起止日期与每日费用),其他用户提交寄养申请,管理员审核通过后主表状态自动流转为「已寄养」。
- 救助信息公益板块:用户可自主发布救助信息(救助地点、救助时间、描述、联系方式),并在个人中心维护自己发布的救助记录,后台统一管理救助状态。
- 个人中心一站式管理:个人信息、我的领养申请、我的寄养申请、我的救助发布、我的寄养发布五个子页面集中管理个人数据。
# 二、 技术实现亮点
- 现代化前端技术栈:采用 Vue 3.4.29(Composition API +
<script setup>)+ Element Plus 2.8.4 + Vite 5.3.1 + Vue Router 4.4.3 + Pinia 2.2.2 + Axios 1.7.5。 - 稳定可靠的后端架构:基于 Django 3.2 + Django REST Framework 3.14.0(APIView 风格)+ PyJWT 2.7.0,配合 drf-yasg 1.21.7 自动生成 Swagger 文档。
- 完善的数据库设计:9 张核心表,全部采用逻辑外键设计、状态字段用中文描述、主键为
bigint自增、金额字段用DECIMAL(10,2),模型统一managed = False由 SQL 脚本建表。 - 丰富的第三方集成:ECharts 5.5.1(数据可视化)、wangEditor 5.1.14(富文本组件)、@wocwin/t-ui-plus 1.4.13(UI 组件库)、sass-embedded 1.83.4(样式编译)。
- 安全性设计:JWT Token 认证 + 请求头 token 校验、未授权统一返回 401、CORS 白名单请求头仅放行
token与content-type、自定义异常统一兜底、修改密码与重置密码均校验操作人身份。
# 三、 用户体验亮点
- 双界面设计:后台面向管理员提供完整 CRUD 与审核功能,前台面向用户提供卡片式浏览、详情申请与个人中心,两套布局各自优化。
- 响应式布局:前台布局内置
@media (max-width: 768px)断点(隐藏用户名文本、隐藏菜单文字),个人中心使用 Element Plus 栅格:xs / :sm / :md自适应。 - 交互优化:
- 友好的加载提示和错误提示。
- 重要操作的确认弹窗。
- 及时的全局消息提示。
- 严谨的前后端表单验证。
- 文件上传体验:统一的
MyUpload.vue组件,支持图片卡片式列表、点击预览弹窗(图片/视频/音频)、limit=1时「点击替换」、超出数量提示,并与表单v-model双向绑定。
# 管理员
# 数据看板
首页统计:查看 4 项核心指标(宠物数量、用户数量、待领养数量、救助信息数量)与 4 张 ECharts 图表(宠物分类分布饼图、领养状态分布柱状图、申请状态分布环形图、近 7 天动态趋势折线图)
# 账号管理
管理员管理:管理管理员账号,支持新增(未填密码时默认密码 123456)、编辑、单个/批量删除、按用户名与联系方式搜索,可将指定管理员密码重置为 123456
用户管理:管理普通用户账号,支持新增、编辑、单个/批量删除、按用户名与联系方式搜索,可将指定用户密码重置为 123456
# 宠物管理
宠物分类管理:管理宠物分类(分类名称、分类描述),支持新增、编辑、单个/批量删除、按分类名称搜索
宠物信息管理:管理宠物档案(宠物名称、宠物分类、年龄(月)、性别、品种、毛色、健康状况、宠物照片、详细描述),支持新增、编辑、单个/批量删除、按名称搜索
# 领养管理
领养信息管理:管理领养信息(选择宠物、标题、领养费用、领养要求、联系方式、地址、领养状态),支持新增、编辑、单个/批量删除、按标题搜索,列表连表展示宠物名称
领养申请管理:查看全部领养申请(领养信息标题、申请人、联系方式、地址、申请理由、状态、拒绝原因、申请时间),对待审核申请执行「通过」或「拒绝」(拒绝需填写拒绝原因),支持删除与按申请人搜索
# 救助与寄养管理
救助信息管理:管理救助信息(标题、宠物名称、品种、性别、救助地点、救助时间、描述、联系方式、救助状态),支持新增、编辑、单个/批量删除、按标题与宠物名称搜索
寄养信息管理:管理寄养信息(标题、宠物图片、宠物名称、品种、性别、寄养起止日期、每日费用、寄养要求、描述、联系方式、寄养状态),支持新增、编辑、单个/批量删除、按标题搜索
寄养申请管理:查看全部寄养申请,对待审核申请执行「通过」或「拒绝」(拒绝需填写拒绝原因),支持删除与按申请人搜索
# 个人设置
个人信息:查看并修改当前管理员的用户名、昵称、联系方式、头像
修改密码:校验旧密码后设置新密码,修改成功后清空本地登录态并跳转登录页
# 普通用户
# 前台浏览
前台首页:查看轮播 Banner、4 项数据概览(待领养宠物、已成功领养、救助信息、寄养信息)以及待领养宠物、宠物救助、宠物寄养三个板块的最新卡片列表
宠物领养:卡片式浏览领养信息,可按标题搜索,查看领养费用、宠物名称、品种、领养要求与状态
领养详情:查看宠物名称、品种、年龄、性别、健康状况、领养要求、联系方式与地址,并在线提交领养申请(申请人姓名、联系方式、地址、申请理由)
宠物救助:卡片式浏览救助信息,可按标题搜索,查看救助地点、状态与描述
救助详情:查看救助信息详情
宠物寄养:卡片式浏览寄养信息,可按标题搜索,查看宠物名称、品种、每日费用、寄养起止时间与寄养状态
寄养详情:查看寄养信息详情,并在线提交寄养申请(申请人姓名、联系方式、地址、申请理由)
# 发布与管理
发布救助信息:填写标题、宠物图片、宠物名称、品种、年龄、性别、救助地点、救助时间、描述、联系方式、救助状态后发布
发布寄养信息:填写标题、宠物图片、宠物名称、品种、年龄、性别、寄养起止日期、每日费用、寄养要求、描述、联系方式、寄养状态后发布
我的救助发布:查看自己发布的救助信息,可查看详情、编辑、删除
我的寄养发布:查看自己发布的寄养信息,可查看详情、编辑、删除,并可跳转发布新寄养信息
我的领养申请:查看自己提交的领养申请记录及其状态,可删除记录
我的寄养申请:查看自己提交的寄养申请记录及其状态,可删除记录
# 个人中心
个人信息:查看用户名、昵称、邮箱、联系方式,并可跳转编辑信息与修改密码
编辑个人信息:修改昵称、联系方式、头像
修改密码:校验旧密码后设置新密码,修改成功后清空本地登录态并跳转登录页
注册账号:自助注册(选择用户类型、用户名、密码、昵称、头像),用户名重复时给出提示
找回密码:通过已注册手机号(contact)提交新密码,后端按手机号查找用户并更新密码(验证码字段仅为表单占位,代码中未做校验)
# 功能权限对照表
| 功能模块 | 管理员 | 普通用户 |
|---|---|---|
| 后台首页统计与图表 | ✓ | - |
| 管理员管理 | ✓ | - |
| 用户管理 | ✓ | - |
| 宠物分类管理 | ✓ | - |
| 宠物信息管理 | ✓ | - |
| 领养信息管理 | ✓ | - |
| 领养申请审核(通过/拒绝) | ✓ | - |
| 救助信息管理 | ✓ | - |
| 寄养信息管理 | ✓ | - |
| 寄养申请审核(通过/拒绝) | ✓ | - |
| 重置他人密码 | ✓ | - |
| 前台首页 | - | ✓ |
| 领养信息浏览与详情 | - | ✓ |
| 提交领养申请 | - | ✓ |
| 我的领养申请(仅自己的) | - | ✓ |
| 救助信息浏览与详情 | - | ✓ |
| 发布救助信息 | - | ✓ |
| 我的救助发布(仅自己的,可编辑/删除) | - | ✓ |
| 寄养信息浏览与详情 | - | ✓ |
| 发布寄养信息 | - | ✓ |
| 我的寄养发布(仅自己的,可编辑/删除) | - | ✓ |
| 提交寄养申请 | - | ✓ |
| 我的寄养申请(仅自己的) | - | ✓ |
| 个人信息 / 修改密码 | ✓ | ✓ |
| 注册 / 找回密码 | ✓ | ✓ |
说明:两套界面的角色隔离由前端布局完成(
AdminLayout拒绝 USER、FrontLayout拒绝非 USER);后端除/common/resetPassword显式校验request.type == "ADMIN"外,其余接口统一由 Token 中间件做登录校验,并以 Token 中的用户 ID 限定「仅自己的」数据(如foster/myPage、rescue/myPage、adoption/application/myPage)。
# 状态说明
# 领养信息状态(adoption.adoption_status)
- 待领养:领养信息已发布,等待用户申请(新增时未传则默认为「待领养」)
- 已领养:领养申请审核通过后由系统自动置为该状态
# 领养申请状态(adoption_application.application_status)
- 待审核:用户已提交申请,等待管理员处理(提交时未传则默认为「待审核」)
- 已通过:管理员审核通过,
reject_reason被清空,同时关联领养信息置为「已领养」 - 已拒绝:管理员审核拒绝,需填写
reject_reason拒绝原因
# 寄养信息状态(foster.foster_status)
- 待寄养:寄养信息已发布,等待用户申请(新增时未传则默认为「待寄养」)
- 已寄养:寄养申请审核通过后由系统自动置为该状态
- 已结束:寄养周期结束(前端状态选项与初始化数据中存在该取值)
# 寄养申请状态(foster_application.application_status)
- 待审核:用户已提交申请,等待管理员处理(提交时未传则默认为「待审核」)
- 已通过:管理员审核通过,
reject_reason被清空,同时关联寄养信息置为「已寄养」 - 已拒绝:管理员审核拒绝,需填写
reject_reason拒绝原因
# 救助信息状态(rescue.rescue_status)
- 待救助:救助信息已发布,等待救助(新增时未传则默认为「待救助」)
- 救助中:救助正在进行
- 已救助:救助已完成
# 默认账号
# 管理员
用户名: admin
密码: 123456
用户类型: ADMIN(登录页请选择「管理员」)
2
3
# 测试用户
用户名: zhangsan
密码: 123456
用户类型: USER(登录页请选择「用户」)
2
3
用户名: lisi
密码: 123456
2
用户名: wangwu
密码: 123456
2
密码在数据库中按明文存储(
admin、user表的password字段为varchar(25),登录时直接比对),以上账号来自project/sql/sql.sql初始化数据。project/test_data.sql另提供 10 个测试用户(zhangsan、lisi、wangwu、zhaoliu、sunqi、zhouba、wujiu、zhengshi、liuer、liuerma)与管理员 admin、admin2,密码同为 123456。
# 核心业务流程
# 注册与登录流程
1. 用户在注册页填写用户类型、用户名、密码、昵称、头像,提交 PUT /common/register
2. 后端校验用户名是否重复,重名返回「用户名重复」
3. 校验通过写入 user 表(接口白名单免登录)
4. 用户在登录页选择用户类型(管理员 / 用户),提交 POST /common/login
5. 后端按类型分别查询 admin 表或 user 表,比对 password 字段
6. 比对成功生成 JWT Token(payload:id、username、type),返回用户信息 + token + type
7. 前端把 token 与 currentUser 写入 localStorage,按 type 跳转 /admin 或 /
2
3
4
5
6
7
# 领养申请审核流程
1. 管理员在「领养信息管理」新增领养信息(选择宠物、填写标题、领养费用、领养要求、联系方式、地址、领养状态)
2. 用户在「宠物领养」列表浏览,进入详情页查看宠物信息与领养要求
3. 用户填写申请人姓名、联系方式、地址、申请理由,提交 POST /adoption/application/add
4. 后端把 user_id 固定为 Token 中的当前用户,application_status 默认为「待审核」
5. 管理员在「领养申请管理」查看申请列表(连表展示领养信息标题)
6. 管理员点击「通过」POST /adoption/application/approve:申请状态置「已通过」且清空拒绝原因,关联领养信息状态自动置「已领养」
或点击「拒绝」POST /adoption/application/reject:申请状态置「已拒绝」并记录拒绝原因
7. 用户在个人中心「我的领养申请」查看审核结果与拒绝原因
2
3
4
5
6
7
8
# 寄养发布与申请流程
1. 用户在「宠物寄养」页点击发布,填写标题、宠物图片、宠物名称、品种、年龄、性别、寄养起止日期、每日费用、寄养要求、描述、联系方式、寄养状态,提交 POST /foster/add
2. 后端把 owner_id 固定为 Token 中的当前用户,foster_status 默认为「待寄养」
3. 其他用户在寄养列表浏览并进入详情,填写联系方式、地址与申请理由,提交 POST /foster/application/add
4. 后端把 user_id 固定为当前用户,application_status 默认为「待审核」
5. 管理员在「寄养申请管理」审核:通过则申请状态置「已通过」且寄养信息状态自动置「已寄养」;拒绝则置「已拒绝」并记录原因
6. 发布者在个人中心「我的寄养发布」查看与维护自己的寄养信息,申请者在「我的寄养申请」查看结果
2
3
4
5
6
# 救助信息发布流程
1. 用户在「宠物救助」页点击发布救助信息,填写标题、宠物图片、宠物名称、品种、年龄、性别、救助地点、救助时间、描述、联系方式、救助状态
2. 提交 POST /rescue/add,后端把 publisher_id 固定为 Token 中的当前用户,rescue_status 默认为「待救助」
3. 用户在个人中心「我的救助发布」查看自己发布的记录,可编辑(PUT /rescue/update)或删除(DELETE /rescue/delete)
4. 管理员在「救助信息管理」维护全部救助信息并切换救助状态(待救助 / 救助中 / 已救助)
2
3
4
# 技术说明
# 系统架构
- 前端:Vue 3.4.29 + Element Plus 2.8.4 + Vite 5.3.1
- 后端:Django 3.2 + Django REST Framework 3.14.0
- 数据库:MySQL(库名 d_3_adoption_system,字符集 utf8mb4)
- 认证:自定义 JWT Token(PyJWT 2.7.0,HS256,请求头
token传递) - API 文档:drf-yasg 1.21.7(Swagger UI)
# 访问地址
- 后端API:http://localhost:8000
- 前端页面:http://localhost:5173(开发环境)
- API文档:http://localhost:8000/swagger/
- Django管理后台:http://localhost:8000/django-admin/
# 数据库
- 数据库名:d_3_adoption_system
- 字符集:utf8mb4
- 总表数:9 张表(admin、user、pet_category、pet、adoption、adoption_application、rescue、foster、foster_application)
| 模型类 | 数据表 | 说明 |
|---|---|---|
| Admin | admin | 管理员表 |
| User | user | 用户表 |
| PetCategory | pet_category | 宠物分类表 |
| Pet | pet | 宠物表 |
| Adoption | adoption | 领养信息表 |
| AdoptionApplication | adoption_application | 领养申请表 |
| Rescue | rescue | 救助信息表 |
| Foster | foster | 寄养信息表 |
| FosterApplication | foster_application | 寄养申请表 |
# API接口规范
RESTful风格:
GET /module/page # 分页查询
POST /module/add # 新增
PUT /module/update # 更新
DELETE /module/delBatch # 批量删除
响应格式:
{
"code": 200,
"msg": "操作成功",
"data": {...}
}
主要API端点:
/common/login # 登录(白名单)
/common/register # 注册(PUT,白名单)
/common/retrievePassword # 找回密码(白名单)
/common/currentUser # 获取当前登录用户
/common/updateCurrentUser # 更新当前用户信息
/common/updatePassword # 修改密码
/common/resetPassword # 重置密码(仅管理员)
/common/statistics # 首页数据概览与图表数据
/file/upload # 文件上传
/admin/page|list|add|update|delete|detail # 管理员管理
/user/page|list|save|delete # 用户管理
/pet/page|list|add|update|delete|delBatch|detail # 宠物信息
/pet/category/page|list|add|update|delete|delBatch|detail # 宠物分类
/adoption/page|list|add|update|delete|delBatch|detail # 领养信息
/adoption/application/page|myPage|list|add|update|delete|delBatch|detail|approve|reject # 领养申请
/rescue/page|myPage|list|add|update|delete|delBatch|detail # 救助信息
/foster/page|myPage|list|add|update|delete|delBatch|detail # 寄养信息
/foster/application/page|myPage|list|add|update|delete|delBatch|detail|approve|reject # 寄养申请
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# JWT Token配置
有效期: 30天(timeout = 60 * 24 * 30 分钟)
算法: HS256,密钥取 Django SECRET_KEY
传递方式: HTTP请求头 token 字段
包含信息: id、username、type(ADMIN / USER)
白名单(精确匹配): /common/login、/common/register、/common/retrievePassword、/goods/uPage、/love、/goods/getGoodsByCategoryId、/category/list
白名单(前缀匹配): /uploads/、/static/、/swagger/、/django-admin/
2
3
4
5
6
# 分页规范
请求参数: pageNum(页码,从 1 开始)、pageSize(每页条数,默认取 settings.PAGE_SIZE = 10)
返回结构: { "total": 总条数, "list": [...] }
前端分页可选每页条数: 后台 5 / 10 / 20 / 50;前台领养列表与救助列表 6 / 12 / 24(默认 12),前台寄养列表 12 / 24 / 36 / 48(默认 12),个人中心各列表 5 / 10 / 20(默认 10)
2
3
# 系统特色
# 富文本编辑
- 组件:
components/MyEditor.vue,基于@wangeditor/editor5.1.14 +@wangeditor/editor-for-vue5.1.12,工具栏使用<Toolbar>+<Editor>,编辑器高度 400px。 - 上传对接:编辑器内图片/视频上传指向
VITE_APP_API_URL + "/file/upload",请求头携带token,字段名为file,通过customInsert回填返回的 URL;视频上传配置maxFileSize为 100 * 1024 * 1024。 - 使用说明:该组件在
views/admin/Admin.vue、views/admin/User.vue中被引入;当前各业务页面中的长文本字段(如领养要求、寄养要求、详细描述)均使用el-input type="textarea"多行文本域录入。
# 数据可视化
- 组件:ECharts 5.5.1
- 图表:宠物分类分布(饼图)、领养状态分布(柱状图)、申请状态分布(环形图)、近 7 天动态趋势(折线图,含新增宠物/领养信息/申请数量/救助信息四条曲线)
- 位置:管理后台首页(
views/admin/Home.vue),数据来源/common/statistics,并在窗口 resize 时自动resize()
# 文件上传
- 上传接口:
POST /file/upload,表单字段名file,需携带请求头token - 存储方式:保存到
settings.UPLOAD_PATH(uploads\,相对于项目根目录),文件名使用uuid4()+ 原文件扩展名,目录不存在时自动创建 - 访问格式:
http://127.0.0.1:8000/uploads/{唯一文件名}(由settings.HTTP_PICTURE拼接返回) - 前端限制:
MyUpload.vue组件默认limit=100,图片类型设置accept="image/*",支持单文件替换、预览与删除