# 8-校园点餐系统 - 功能说明
# 项目概述
本项目是"校园点餐系统"的 Django 3.2 + Vue 3 前后端分离工程,目前处于基础框架搭建阶段。项目已落地一套通用的后台管理框架:后端按功能拆分为多个独立 Django App(admin 管理员、user 普通用户、pet 示例宠物信息、test 代码生成器测试模块),提供账号体系、统一响应格式、自定义 JWT 认证、Token 拦截中间件、文件上传与 Swagger 接口文档;前端提供登录、注册、找回密码、个人信息维护以及后台的首页、管理员管理、用户管理、宠物分类管理页面,前台与后台使用两套独立布局。点餐相关的业务模块(档口、菜品、购物车、订单等)尚未在代码中实现,CodeGenerator 代码生成器已接入,用于后续依据点餐业务数据表批量生成对应模块的前后端代码。
# 项目概览
# ✨ 创新点
# 1. 模块化独立 App 架构
- 要点:
apps/下每个功能模块独立为一个 Django App,各自持有models.py、Serializer、views.py、urls.py,当前包含admin、user、pet、test四个业务模块与仅存放工具类的common。 - 要点:项目级
project/urls.py以include方式挂载各模块前缀(common/、admin/、user/、pet/、test/),模块之间互不耦合,新增业务只需新增 App 并挂载路由。 - 要点:管理员模块使用自定义
AppConfig(apps/admin/apps.py,label = 'custom_admin'),规避与django.contrib.admin的 App label 冲突(settings.py中已注释说明该处理方式)。
# 2. 自定义 JWT 认证体系
- 要点:基于 PyJWT 2.7.0 实现(
utils/jwt_auth.py),采用 HS256 算法,签名密钥直接复用 Django 的SECRET_KEY。 - 要点:Token 有效期默认
60*24*30分钟(30 天),载荷中写入id、username、type(type为用户类型标识:ADMIN或USER)。 - 要点:不使用标准的
Authorization请求头,而是通过自定义的token请求头传递,并在settings.py的CORS_ALLOW_HEADERS中显式放行token。
# 3. 中间件统一鉴权与用户上下文注入
- 要点:
middleware/TokenInterceptorMiddleware.py对所有请求做统一拦截,白名单包括精确匹配的/common/login、/common/register、/common/retrievePassword与前缀匹配的/uploads/、/static/、/swagger/、/django-admin/。 - 要点:Token 解析成功后把
id、username、type注入request对象,视图通过request.id、request.type识别当前登录用户与角色。 - 要点:缺少 Token 或 Token 校验失败时,直接返回
ResponseMessage.jump(401, "访问接口未授权,请重新登录")。
# 4. Java 代码生成器一键生成 CRUD
- 要点:
CodeGenerator提供DjangoCodeGenerator、VueCodeGenerator、BatchCodeGenerator三个生成器与 Velocity 模板(templates/page.vue.vm),可依据数据库表结构一次性生成后端与前端代码。 - 要点:
CodeGeneratorMain中集中配置数据库连接与待生成的表清单(当前配置为生成test表到test模块),路径由DjangoProjectPathConfig统一计算(Django 的apps目录与 Vue 的views目录)。 - 要点:现有
pet模块即为生成产物,其文件形态具有典型的生成器特征——PetSerializer.py(fields = "__all__"+read_only_fields)、views.py中 Page/Add/Update/Delete/Detail/List 六个标准视图、urls.py中page/list/add/update/delete/detail六个标准路由。
# 5. 统一响应格式与业务异常体系
- 要点:
apps/common/ResponseMessage.py统一封装{"code": ..., "msg": ..., "data": ...}响应体,提供success、failed、other、jump四个静态方法。 - 要点:
utils/custom_exception.py定义了CustomException基类及NotFoundException、PermissionDeniedException、UnauthorizedException、ValidationException、BusinessException五类业务异常(分别对应 404/403/401/400/409)。 - 要点:
utils/exception_handler.py提供全局异常处理器,按"自定义异常 → Django 内置异常 → DRF 异常 → 未知异常"四级顺序统一转换为标准响应体(当前settings.py的REST_FRAMEWORK中尚未配置EXCEPTION_HANDLER,该处理器已实现但未启用)。
# ✨ 项目亮点
# 一、 业务功能亮点
- 账号体系:注册(用户名重复校验)、登录(按角色分别查询管理员表与用户表)、找回密码(按手机号重置密码)、完善的支持角色区分与 Token 下发。
- 个人信息与密码维护:
EditCurrentUser.vue修改头像、邮箱、电话;EditPassword.vue校验旧密码后修改新密码,修改成功后清空本地登录状态并要求重新登录。 - 管理员与用户管理:后台提供管理员管理与普通用户管理两个列表页,均支持分页查询、按用户名/手机号搜索、新增、编辑、单条删除与批量删除(带确认弹窗),并提供"重置密码"高级操作。
- 示例业务模块:以"宠物分类/宠物信息"作为示例模块,提供完整的增删改查、分页、名称模糊搜索能力,可作为后续点餐业务模块的代码模板。
# 二、 技术实现亮点
- 现代化前端技术栈:采用 Vue ^3.4.29 + Element Plus ^2.8.4 + Vite ^5.3.1 + Axios ^1.7.5 + Pinia ^2.2.2 + Vue Router ^4.4.3,另在
package.json中声明 ECharts ^5.5.1、@wangeditor/editor ^5.1.14、crypto-js ^4.1.1、dayjs ^1.11.13、swiper ^11.1.14、@element-plus/icons-vue ^2.3.1 等依赖。 - 稳定可靠的后端架构:Django ~=3.2(
settings.py文件头显示由 Django 3.2.20 生成)+ Django REST Framework ~=3.14.0,认证使用 PyJWT ~=2.7.0,接口文档使用 drf-yasg 1.21.7,跨域使用 django-cors-headers 4.2.0,数据库驱动为 PyMySQL 1.1.0 与 mysqlclient 2.1.1。 - 完善的数据库设计:3 张核心数据表(
admin、user、pet),采用逻辑外键设计(pet.category_id、pet.user_id只存关联 ID,无物理外键约束),主键统一为bigint自增,所有模型均为managed = False(由 SQL 脚本建表),Pet表的create_time由pre_save信号在新增时自动写入。 - 代码生成器支持:集成 Java 版代码生成器(
CodeGenerator),配置数据库连接与表清单后即可批量生成 Django 的models.py/Serializer/views.py/urls.py与 Vue3 管理页面,显著降低新增业务模块的重复编码量。 - 安全性设计:密码在数据库中为明文存储(
admin、user表字段及初始化 SQL 均为明文,apps/user/views.py中保留的 md5 加密代码处于注释状态、未启用),登录时直接比对;Token 采用 HS256 签名并设置 30 天有效期;TokenInterceptorMiddleware对非白名单接口统一拦截;涉及他人数据的操作做了二次校验(updatePassword、updateCurrentUser校验只能操作本人,resetPassword校验操作者必须为ADMIN);跨域仅放行token与content-type请求头。
# 三、 用户体验亮点
- 双界面设计:前台
FrontLayout.vue采用顶部横向导航(首页、个人中心),面向普通用户;后台AdminLayout.vue采用左侧深色侧边栏导航(首页、管理员管理、用户管理、宠物分类管理),面向管理员;两者均带右上角用户下拉菜单(个人信息、修改密码、退出登录)。 - 响应式布局:前台布局使用
el-row/el-col栅格,并通过@media (max-width: 768px)媒体查询在小屏下隐藏用户名文字、菜单文字并调整搜索框宽度;个人中心页面按:xs/:sm/:md断点自适应。 - 交互优化:
- 错误提示:
utils/http.js响应拦截器按业务code(200/401/409/500)与 HTTP 状态码(401/404/500/502/503)分别弹出ElMessage提示,网络异常单独提示"网络连接失败,请检查网络";请求超时时间设置为 5000ms(源码中未使用 loading 遮罩,无v-loading)。 - 重要操作的确认弹窗:删除与批量删除均使用
ElMessageBox.confirm二次确认,提示"此操作将永久删除 ID 为 [...] 的数据, 是否继续?",取消时提示"已取消删除"并清空表格选中项。 - 及时的全局消息提示:新增、修改、删除、登录、注册、重置密码等操作成功后统一使用
ElMessage反馈(如"操作成功"、"登录成功,正在跳转"),新增账号时提示"新增用户密码默认为:123456"。 - 严谨的前后端表单验证:前端表单通过
el-form的rules与prop做必填校验(用户名、昵称、分类名称、分类描述等),校验失败弹出"验证失败,请检查必填项!";后端由 DRFModelSerializer做反序列化校验,校验不通过返回统一失败响应。
- 错误提示:
- 文件上传体验:统一使用
components/MyUpload.vue组件,支持imageCard/image/video/audio/file五种类型;limit = 1时再次上传自动替换(提示"点击替换");图片点击可放大预览(表格中使用:preview-teleported="true"),视频/音频弹窗播放,普通文件直接下载;上传请求自动携带token请求头。
# 管理员
# 系统管理
首页:/admin/home,对应 views/admin/Home.vue,当前为占位页面(页面内容仅为"首页"文本)。
管理员管理:对应 views/admin/Admin.vue,页面菜单名为"管理员管理";支持按用户名、手机号条件搜索与分页浏览(分页参数 pageNum),可新增账号(不填密码时后端默认写入 123456,前端提示"新增用户密码默认为:123456")、编辑账号(编辑时用户名输入框禁用)、单条删除、勾选后批量删除,并可通过"重置密码"按钮将该账号密码重置为 123456。对应后端接口 /admin/page、/admin/list、/admin/add、/admin/update、/admin/delete(批量)、/admin/detail(apps/admin/views.py,接口内部使用 User 模型读写账号数据)。
普通用户管理:对应 views/admin/User.vue,页面菜单名为"用户管理";功能与管理员管理一致——条件搜索、分页、新增、编辑、单条删除、批量删除、重置密码(重置时请求参数为 type=USER)。前端调用的接口路径为 /user/page、/user/add、/user/update、/user/delete(后端 apps/user/urls.py 提供的实际路由为 page、list、save、delete、register、login)。
# 示例模块
宠物类型:后台菜单"宠物分类管理"指向 /admin/pet 路由,加载 views/admin/PetCategory.vue;页面提供分类的名称模糊搜索、分页、新增、编辑、单条删除与批量删除(带确认弹窗),表格列为 ID、分类名称、分类描述,表单项为分类名称、分类描述(均必填)。该页面调用的接口为 /pet/page、/pet/add、/pet/update、/pet/delBatch。
宠物信息:对应 views/admin/Pet.vue 与后端 apps/pet 模块,字段涵盖宠物名称、分类 ID、年龄(月)、性别、品种、毛色、健康状况、宠物照片、详细描述、来源类型、发布用户 ID、创建时间;提供按宠物名称模糊搜索、分页查询、新增、编辑、单条删除与批量删除。后端提供 /pet/page(分页 + name 模糊查询)、/pet/list(不分页全量)、/pet/add、/pet/update、/pet/delete(批量,请求体为 ID 数组)、/pet/detail 六个接口。
# 普通用户
# 账号功能
注册/登录:views/Register.vue 提供注册页面,表单包含头像上传(MyUpload 组件)、用户类型(管理员/用户下拉选择)、用户名、密码、昵称,提交至 PUT /common/register,后端先校验用户名是否重复(重复返回"用户名重复"),再经 UserSerializer 校验保存并返回用户数据;views/Login.vue 提供登录页面,表单为用户名、密码与用户类型下拉(选项为"管理员"ADMIN、"用户"USER),提交至 POST /common/login,登录成功后把 token 与用户信息写入 localStorage,普通用户跳转前台 /,管理员跳转后台 /admin;登录页同时提供"没有账号?去注册"与"忘记密码?"入口。
找回密码:views/RetrievePassword.vue,表单为用户类型、手机号、验证码、新密码,提交至 POST /common/retrievePassword;后端按手机号(contact 字段)查找用户,未注册时返回"该手机号未注册",否则更新密码(源码中验证码校验为待办项,未实际校验)。
# 个人中心
个人信息:前台菜单"个人中心"(/personalCenter,默认跳转 /personalCenter/profile)下的 views/front/personalCenter/Profile.vue 只读展示用户名、昵称、邮箱、联系方式(数据取自本地登录信息);views/EditCurrentUser.vue 为可编辑页面,支持更换头像(MyUpload 组件)并修改邮箱、电话,提交至 POST /common/updateCurrentUser,成功后重新拉取 GET /common/currentUser 并刷新本地缓存的当前用户信息。
修改密码:views/EditPassword.vue,表单为旧密码与新密码,提交至 POST /common/updatePassword;后端校验是否本人操作(user_id != request.id 时返回"无权修改其他用户密码")并比对旧密码(不一致返回"原密码错误"),修改成功后前端清空本地登录状态并跳转登录页。
# 功能权限对照表
| 功能模块 | 管理员 | 普通用户 |
|---|---|---|
| 登录 / 注册 | ✓ | ✓ |
| 找回密码 | ✓ | ✓ |
| 个人信息查看与修改 | ✓(仅自己的) | ✓(仅自己的) |
| 修改密码 | ✓(仅自己的) | ✓(仅自己的) |
| 重置密码(重置他人密码) | ✓ | - |
| 后台首页 | ✓ | - |
| 管理员管理 | ✓ | - |
| 普通用户管理 | ✓ | - |
| 宠物分类管理 | ✓ | - |
| 宠物信息(后台页面文件存在) | 页面文件存在但未注册路由 | - |
| 前台首页 | - | ✓ |
| 个人中心 | - | ✓ |
说明:角色差异由前端布局控制——AdminLayout.vue 中若当前用户 type === 'USER' 则跳转前台 /,FrontLayout.vue 中若当前用户 type !== 'USER' 则跳转后台 /admin;后端接口未逐接口做角色校验,仅 resetPassword 校验操作者必须为 ADMIN。
# 默认账号
初始化数据来自 project/sql/sql.sql(密码在该脚本中为明文)。
# 管理员
用户名: admin
密码: 123456
2
(昵称:系统管理员;联系方式:13800000000;邮箱:admin@example.com)
# 测试用户
用户名: user
密码: 123456
2
(昵称:管理员;联系方式:13800000000;邮箱:user@qqq.com)
# 核心业务流程
# 用户注册流程
1. 在注册页填写头像、用户类型(ADMIN / USER)、用户名、密码、昵称,前端做必填校验。
2. 前端调用 PUT /common/register 提交表单。
3. 后端 RegisterAPIView 按 username 查询 user 表,已存在则返回"用户名重复"。
4. 移除请求中的 type 字段后交给 UserSerializer 反序列化校验(校验失败抛异常)。
5. 校验通过写入 user 表,返回注册成功的用户数据。
6. 前端提示"注册成功,正在跳转"并跳转到 /login。
2
3
4
5
6
# 登录与 Token 认证流程
1. 登录页选择用户类型(ADMIN / USER),提交 POST /common/login。
2. 后端 LoginAPIView 校验 type 必须为 "ADMIN" 或 "USER"(否则返回"无效的用户类型")。
3. ADMIN 查询 admin 表、USER 查询 user 表,比对明文密码,不一致返回"用户名或者是密码错误"。
4. 调用 utils.jwt_auth.create_token 生成 JWT(HS256,载荷含 id、username、type,有效期 30 天)。
5. 前端把 token 与用户信息写入 localStorage,并按 type 跳转前台 / 或后台 /admin。
6. 后续请求由 utils/http.js 请求拦截器自动在请求头追加 token。
7. TokenInterceptorMiddleware 校验 token:白名单直接放行;校验失败或未携带 token 返回 code = 401,前端拦截器清除 token 并跳回登录页;校验成功则注入 request.id / username / type。
2
3
4
5
6
7
# 找回密码与重置密码流程
1. 用户在找回密码页填写用户类型、手机号、验证码、新密码,提交 POST /common/retrievePassword。
2. 后端按 contact(手机号)查询用户,未注册返回"该手机号未注册"。
3. 命中则直接更新该用户的 password 字段并返回成功(验证码校验为待办,未实现)。
4. 管理员在后台列表页点击"重置密码",前端请求 POST /common/resetPassword?type=ADMIN&id={id}(用户页为 type=USER)。
5. 后端 ResetPasswordAPIView 校验操作者 request.type 必须为 "ADMIN",否则返回"无权执行此操作"。
6. 校验通过后把目标账号密码重置为 123456,返回"密码重置成功,新密码为:123456"。
2
3
4
5
6
# 代码生成器生成业务模块流程
1. 在数据库中建好业务表(字段 COMMENT 会作为中文显示名)。
2. 修改 CodeGeneratorMain 中的数据库连接信息与待生成表清单(表名、中文名、目标 App 名)。
3. 确认 DjangoProjectPathConfig 的 PROJECT_ROOT 指向本项目 project 目录。
4. 运行 CodeGeneratorMain 的 main 方法,由 BatchCodeGenerator 读取表结构并渲染生成代码。
5. 生成后端 apps/{app}/ 下的 models.py、{Model}Serializer.py、views.py(Page/Add/Update/Delete/Detail/List)、urls.py。
6. 生成前端 views/admin/{Model}.vue 管理页面(搜索 + 表格 + 分页 + 新增/编辑弹窗)。
7. 手动完成收尾:注册 INSTALLED_APPS、在 project/urls.py 挂载路由、在 frontend/src/router/index.js 与 AdminLayout.vue 中添加路由与菜单。
2
3
4
5
6
7
# 技术说明
# 系统架构
- 前端:Vue 3.4.29 + Element Plus 2.8.4 + Vite 5.3.1
- 后端:Django 3.2(
~=3.2,settings 由 Django 3.2.20 生成)+ Django REST Framework 3.14(~=3.14.0) - 数据库:MySQL(
django.db.backends.mysql,当前配置库名django_template,字符集 utf8mb4,settings.py未声明服务器版本;sql/sql.sql导出信息显示来源服务器为 MySQL 5.7.26) - 认证:自定义 JWT Token(PyJWT 2.7.0,HS256,通过自定义
token请求头传递) - 接口文档:drf-yasg 1.21.7(Swagger)
# 访问地址
- 后端 API:http://localhost:8000(
frontend/.env.development中VITE_APP_API_URL='http://127.0.0.1:8000',settings.py中HTTP_PICTURE = "http://127.0.0.1:8000/uploads/") - 前端页面:http://localhost:5173(开发环境;
vite.config.js未自定义server.port,使用 Vite 默认端口) - 接口文档:http://localhost:8000/swagger/(另有 Django 自带后台
/django-admin/) - 生产环境:
frontend/.env.production中VITE_APP_API_URL='/api',前端目录附带Dockerfile与nginx.conf
# 数据库
- 数据库名:
django_template(沿用模板默认值,尚未按项目重命名;HOST: 118.89.93.2,PORT: 3306,USER: root) - 字符集:utf8mb4(
sql/sql.sql中SET NAMES utf8mb4,建表语句为CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci) - 总表数:3 张表(按
apps/*/models.py中显式db_table统计)admin—— 管理员表(apps/admin/models.py→Admin:username、password、nickname、email、contact、avatar)user—— 用户表(apps/user/models.py→User:username、password、nickname、email、contact、avatar)pet—— 宠物信息表(apps/pet/models.py→Pet:name、category_id、age、gender、breed、color、health_status、image、description、source_type、user_id、create_time)
- 补充说明:
sql/sql.sql中只包含admin、user两张表的建表语句与初始化数据,未包含pet表;apps/common/models.py中的Test、A、B、C为字段类型学习示例(未声明db_table,且common未注册到INSTALLED_APPS),不计入表清单。
# 系统特色
# 统一响应格式
所有业务接口通过 apps/common/ResponseMessage.py 返回统一结构,前端 utils/http.js 依据 code 做统一分发(200 直接返回数据、401 清除 token 并跳登录、409/500 及其他弹出错误提示):
{
"code": 200,
"msg": "操作成功",
"data": {...}
}
2
3
4
5
# 接口风格
各模块遵循同一套 CRUD 约定(以 pet 模块为例):GET /pet/page(分页查询,参数 pageNum,分页大小取自 settings.PAGE_SIZE = 10)、GET /pet/list(不分页全量)、POST /pet/add(新增)、PUT /pet/update(更新,partial=True)、DELETE /pet/delete(批量删除,请求体为 ID 数组)、GET /pet/detail?id={id}(详情)。
# 全局异常处理
utils/exception_handler.py 实现了自定义全局异常处理器(按"自定义异常 → Django 内置异常 → DRF 异常 → 未知异常"顺序转换为标准响应体),配合 utils/custom_exception.py 中的六类异常使用;当前 settings.py 的 REST_FRAMEWORK 配置中未设置 EXCEPTION_HANDLER,需配置后生效。
# 工具函数库
utils/jwt_auth.py:create_token(签发 Token)与get_payload(解析 Token,区分 DecodeError / ExpiredSignatureError / InvalidTokenError 三类失败),另提供JwtQueryParamAuthentication、JwtHeaderAuthentication两个 DRF 认证类。utils/current_user.py:基于threading.local()实现的当前用户工具(set_current_user、get_current_user、get_current_user_id、get_current_username、clear_current_user),配套中间件middleware/CurrentUserMiddleware.py(当前settings.MIDDLEWARE中未注册)。apps/common/UserThreadLocal.py:另一份线程局部存储实现(set/get/clear)。utils/DateUtil.py:get_date/get_last_seven_days,返回最近七天的日期字符串列表,供统计类需求使用。
# 文件上传
- 上传接口:
POST /file/upload(字段名file),由apps/common/views.py的FileUploadAPIView处理,上传目录不存在时自动创建。 - 存储方式:使用
uuid4重命名并保留原扩展名,保存到settings.UPLOAD_PATH = "uploads\\"(相对项目根目录);MEDIA_URL = '/uploads/'、MEDIA_ROOT = BASE_DIR/uploads,开发环境通过static()提供访问。 - 访问格式:
settings.HTTP_PICTURE = "http://127.0.0.1:8000/uploads/",返回结果为{"name": 原文件名, "url": 完整访问地址}。 - 限制说明:后端源码中未对上传文件的大小与扩展名做校验;前端
MyUpload.vue按组件type限定accept(image/*、video/*、audio/*),@wangeditor编辑器的视频上传配置中设置了maxFileSize: 100 * 1024 * 1024(注释写为 10M)。
# 富文本编辑器
- 组件:
components/MyEditor.vue,基于 @wangeditor/editor ^5.1.14 与 @wangeditor/editor-for-vue ^5.1.12。 - 能力:提供工具栏 + 编辑区,通过
content属性传入初始内容、content-change事件回传 HTML,图片与视频上传均指向/file/upload并自动携带token请求头。 - 现状:该组件已在
views/admin/Admin.vue、views/admin/User.vue中导入,但当前表单中并未实际使用(现有业务表也没有富文本字段)。
# 代码生成器
- 位置:
CodeGenerator/(Java + Velocity),核心类为CodeGeneratorMain、BatchCodeGenerator、DjangoCodeGenerator、VueCodeGenerator、DjangoProjectPathConfig。 - 能力:读取数据库表结构,批量生成 Django 的
models.py、{Model}Serializer.py、views.py、urls.py与 Vue3 的views/admin/{Model}.vue管理页面。 - 使用:修改
CodeGeneratorMain中的数据库配置与表清单后运行其main方法;DjangoProjectPathConfig.PROJECT_ROOT当前仍指向模板来源目录(G:\自研版本\4-Django+Vue3-代码生成器-多表多角色\project),用于本项目时需先改成本项目project目录。
# 项目当前状态说明
重要提示:本项目目前为基础框架版本,校园点餐相关的业务模块(如菜品/档口/购物车/订单等)尚未在代码中实现。 框架已具备:账号体系(注册/登录/找回密码/修改密码)、管理员管理、普通用户管理、示例模块(宠物分类、宠物信息)、JWT 认证与 Token 拦截中间件、文件上传、统一响应格式、Swagger 接口文档、Java 代码生成器。 后续可基于
CodeGenerator依据点餐业务数据表批量生成对应模块的 Django + Vue3 代码,并按既有代码风格补充业务页面与路由菜单。
# 现状补充说明(供二次开发参考)
- 数据库配置:
settings.py中库名仍为模板默认值django_template,尚未按本项目重命名。 - 预置页面:后台首页
views/admin/Home.vue与前台首页views/front/Index.vue目前均为占位页面(内容仅为"首页"文本),尚未实现统计或数据展示;package.json中虽已声明 ECharts 依赖,但frontend/src中未检索到任何 ECharts 引用。 - 未注册的页面:
views/admin/Pet.vue(宠物信息管理页)文件存在,但router/index.js中未注册路由、AdminLayout.vue中也没有对应菜单;菜单"宠物分类管理"实际加载的是views/admin/PetCategory.vue。 - 未使用的文件:
apps/pet/PetCategorySerializer.py引用了并不存在的PetCategory模型(该文件未被任何代码导入);apps/test目录下仅有编译产物(__pycache__中的.pyc),对应源码文件已不存在,但apps/test仍注册在INSTALLED_APPS中且project/urls.py仍挂载了test/路由。 - 前后端字段与路径尚未完全对齐:多个页面使用
avatarUrl、tel字段名,而模型字段为avatar、contact;Pet.vue/PetCategory.vue调用的删除接口为/pet/delBatch(后端实际路由为/pet/delete),User.vue调用的/user/add、/user/update在后端对应的是/user/save。