# 10-医院管理系统 - 功能说明
# 项目概述
本项目是基于 Django 3.2 + Django REST Framework + Vue 3 + Element Plus 的前后端分离「医院管理系统」工程项目,目前处于基础框架搭建阶段:已经完成通用的多角色后台框架、账号体系(注册、登录、找回密码、个人信息与密码修改、管理员重置密码)、JWT 认证与中间件拦截、文件上传、统一响应格式,并集成了 Java 版代码生成器(CodeGenerator),可在建表后批量生成 Django 与 Vue3 的 CRUD 代码;但医院业务模块(科室、医生、挂号预约、就诊记录等)尚未生成,代码中不存在任何医院业务表与业务接口,现有的 pet(宠物)模块是脚手架自带的示例模块,用于演示代码生成与 CRUD 页面效果。
# 项目概览
# ✨ 创新点
# 1. 模块化独立 App 架构
- 要点:后端按职能拆分为独立 Django App——
apps/admin(管理员接口)、apps/user(用户接口)、apps/pet(示例模块)、apps/common(登录注册、文件上传等公共接口)。 - 要点:每个 App 自带
models.py、XxxSerializer.py、views.py、urls.py,由project/urls.py统一挂载(/admin/、/user/、/pet/、/common/)。 - 要点:
apps/admin/apps.py通过label = 'custom_admin'设置唯一应用标签,避免与django.contrib.admin冲突而导致的 App label 重复报错。
# 2. 自定义 JWT 认证与中间件统一拦截
- 要点:
utils/jwt_auth.py使用 PyJWT 生成 / 解析 Token,算法 HS256,密钥直接复用 Django 的SECRET_KEY,默认有效期60*24*30分钟(30 天)。 - 要点:Token 载荷中携带
id、username、type(ADMIN/USER)三项信息,前端把 Token 放在请求头token字段中传递(非标准Authorization)。 - 要点:
middleware/TokenInterceptorMiddleware.py全局校验 Token,白名单外的一律要求登录,校验失败统一返回{"code": 401}由前端跳转登录页。
# 3. Java 代码生成器一键生成 CRUD
- 要点:
CodeGenerator基于 Spring Boot 2.5.6 + MyBatis-Plus Generator 3.5.2 + Velocity 2.3,读取数据库表结构后批量生成代码。 - 要点:一次生成 Django 侧
models.py、序列化器、views.py(分页/新增/更新/批量删除/详情/列表)、urls.py,以及 Vue3 侧带搜索、表格、分页、弹窗表单的后台管理页面。 - 要点:生成内容会自动注册到
settings.py的INSTALLED_APPS、project/urls.py、frontend/src/router/index.js与AdminLayout.vue菜单,并带重复检测。
# 4. 统一响应格式与全局异常处理体系
- 要点:
apps/common/ResponseMessage.py提供success/failed/other/jump四个静态方法,所有接口统一返回code、msg、data三段结构。 - 要点:
utils/custom_exception.py定义了CustomException、NotFoundException、PermissionDeniedException、UnauthorizedException、ValidationException、BusinessException六类业务异常。 - 要点:
utils/exception_handler.py提供全局异常处理器(优先级:自定义异常 → Django 内置异常 → DRF 异常 → 未知异常),统一转换为code / msg / data格式并记录日志。
# ✨ 项目亮点
# 一、 业务功能亮点
- 双角色账号体系:系统按
ADMIN(管理员)与USER(普通用户)两种角色划分,角色只存在于 JWT Token 的type字段中,登录时由前端选择、后端写入 Token,不落库。 - 完整的账号全流程:提供注册(
PUT /common/register)、登录(POST /common/login)、找回密码(POST /common/retrievePassword)、查询当前用户(GET /common/currentUser)、修改个人信息(POST /common/updateCurrentUser)、修改密码(POST /common/updatePassword)、管理员重置密码(POST /common/resetPassword)。 - 后台账号与用户管理:后台提供「管理员管理」(
/admin/admin)与「用户管理」(/admin/user)两个页面,支持分页查询、按用户名与手机号搜索、新增、编辑、单条/批量删除,并支持管理员一键「重置密码」。 - 示例业务模块:
pet模块提供「宠物分类管理」菜单(/admin/pet)与宠物信息完整 CRUD 接口(分页、列表、新增、更新、删除、详情),作为代码生成器与页面模板的落地示例。
# 二、 技术实现亮点
- 现代化前端技术栈:采用 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;另在package.json中预置了 ECharts^5.5.1、wangEditor^5.1.14、@element-plus/icons-vue ^2.3.1、dayjs^1.11.13、lodash^4.17.21等常用依赖。 - 稳定可靠的后端架构:Django
~=3.2(settings.py由 Django 3.2.20 生成)+ Django REST Framework~=3.14.0,配套 PyJWT~=2.7.0、PyMySQL1.1.0/ mysqlclient2.1.1、django-cors-headers4.2.0、drf-yasg1.21.7;接口均基于 DRF 的APIView/GenericAPIView实现。 - 完善的数据库设计:
sql/sql.sql建表脚本包含 2 张基础表(admin、user),Django 模型层共定义 3 张表(admin、user、pet);表之间采用逻辑外键关联(如pet.category_id、pet.user_id均为整型字段,不建物理外键),表的字符集为utf8mb4/utf8mb4_unicode_ci,主键统一为bigint自增且注释为「ID」。 - 代码生成器支持:集成 Java 版代码生成器
CodeGenerator,可在CodeGeneratorMain.java中配置数据库连接与「表名 + 中文名 + App 名」列表,一键生成 Django 后端与 Vue3 前端 CRUD 代码,并自动注册 App、路由与后台菜单。 - 安全性设计:
- Token 认证与拦截:
TokenInterceptorMiddleware对非白名单请求强制校验 Token,并将解析出的id、username、type注入request,供视图做身份判断。 - 越权校验:
UpdateCurrentUserAPIView、UpdatePasswordAPIView均校验id必须等于当前登录用户request.id,否则返回「无权修改其他用户信息 / 密码」;ResetPasswordAPIView校验request.type必须为ADMIN,否则返回「无权执行此操作」。 - 接口白名单:仅放行
/common/login、/common/register、/common/retrievePassword等少量接口,/uploads/、/static/、/swagger/、/django-admin/按前缀放行。 - 跨域控制:通过
django-cors-headers配置CORS_ORIGIN_ALLOW_ALL = True,并在CORS_ALLOW_HEADERS中显式允许token请求头。 - 密码存储:按框架约定,
admin.password、user.password字段长度均为varchar(25),登录时进行明文比对(apps/user/views.py中保留了 MD5 校验的注释代码,未启用)。
- Token 认证与拦截:
# 三、 用户体验亮点
- 双界面设计:前台为顶部横向导航 + 内容区的简洁展示界面(
FrontLayout.vue,菜单「首页 / 个人中心」);后台为左侧深色侧边导航 + 顶栏用户下拉的管理界面(AdminLayout.vue,菜单「首页 / 管理员管理 / 用户管理 / 宠物分类管理」)。 - 响应式布局:
FrontLayout.vue使用@media (max-width: 768px)在小屏下隐藏用户名文字与菜单文字;个人中心页面通过el-col的:xs="24" :sm="6/18" :md="5/19"实现响应式分栏;登录、注册、找回密码页使用全屏背景图居中卡片布局。 - 交互优化:
- 友好的加载提示和错误提示。
- 重要操作的确认弹窗。
- 及时的全局消息提示。
- 严谨的前后端表单验证。
- 文件上传体验:封装通用上传组件
components/MyUpload.vue——支持imageCard/image/video/audio/file五种类型自动切换上传样式与accept限制;上传请求自动携带 Token;单文件模式(limit=1)下再次选择文件即自动替换;超出数量限制时给出「最多只允许上传 N 张图片」提示;支持图片/视频/音频预览弹窗与文件下载;头像栏同时用el-image+:preview-teleported="true"支持表格内点击预览。
# 管理员
# 系统管理
管理员管理:在「管理员管理」页面(/admin/admin)分页查看账号列表(ID、用户名称、昵称、用户头像、电话、邮箱),支持按用户名、手机号搜索与重置,支持新增账号(未填写密码时后端默认写入 123456)、编辑账号、单条删除与勾选批量删除,并可对任意账号执行「重置密码」——调用 POST /common/resetPassword?type=ADMIN&id=xx 将密码重置为 123456。
普通用户管理:在「用户管理」页面(/admin/user)分页查看用户列表,操作能力与管理员管理一致(搜索、新增、编辑、删除、批量删除、重置密码);对应接口为 /user/page、/user/list、/user/save、/user/delete(批量删除使用 POST + ID 数组)。
个人账号:后台顶栏用户下拉菜单提供「个人信息」(跳转 /admin/editCurrentUser,可修改头像、邮箱、电话)、「修改密码」(跳转 /admin/editPassword,校验旧密码后修改)与「退出登录」(清空 localStorage 并跳回登录页)。
# 示例模块
宠物类型:「宠物分类管理」菜单(/admin/pet)对应的页面提供分类名称搜索、新增、编辑、删除、批量删除与分页功能,接口复用 /pet/page、/pet/add、/pet/update、/pet/delBatch。
宠物信息:提供完整的宠物信息 CRUD 接口——分页查询(GET /pet/page,支持按宠物名称模糊搜索、pageNum 分页、页大小 10 条)、全部列表(GET /pet/list)、新增(POST /pet/add)、更新(PUT /pet/update,局部更新)、批量删除(DELETE /pet/delete)、详情(GET /pet/detail);字段包含宠物名称、分类 ID、年龄(月)、性别、品种、毛色、健康状况、宠物照片、详细描述、来源类型、发布用户 ID、创建时间。对应的完整管理页面为 frontend/src/views/admin/Pet.vue。
# 普通用户
# 账号功能
注册/登录:前台注册页(/register)填写头像、用户类型、用户名、密码、昵称后提交 PUT /common/register,后端先校验用户名是否重复,再写入 user 表;登录页(/login)选择用户类型(管理员 / 用户)并提交 POST /common/login,后端根据 type 分别查询 admin 表或 user 表并比对密码,成功后返回用户信息与 Token,前端将 token、currentUser 写入 localStorage,并按角色跳转——USER 进入前台 /,ADMIN 进入后台 /admin。
找回密码:找回密码页(/retrievePassword)填写手机号、验证码与新密码后提交 POST /common/retrievePassword,后端按 contact(联系方式)匹配用户并更新密码(代码中保留了验证码校验的 TODO 注释,当前未实际校验验证码)。
# 个人中心
个人信息:前台「个人中心 → 个人信息」(/personalCenter/profile)展示用户名、昵称、邮箱、联系方式(数据取自本地登录信息);点击「编辑信息」进入 /editCurrentUser,可修改头像、邮箱、电话,提交 POST /common/updateCurrentUser 成功后重新拉取 GET /common/currentUser 并刷新本地用户信息。
修改密码:/editPassword 页面填写旧密码与新密码,提交 POST /common/updatePassword,后端校验身份与旧密码一致后更新,成功后前端清空本地登录信息并跳转登录页重新登录。
# 功能权限对照表
| 功能模块 | 管理员 | 普通用户 |
|---|---|---|
| 注册 | ✓ | ✓ |
| 登录(含角色选择) | ✓ | ✓ |
| 找回密码 | ✓ | ✓ |
| 查看当前用户信息 | ✓ | ✓ |
| 修改个人信息 | ✓ 仅本人 | ✓ 仅本人 |
| 修改密码 | ✓ 仅本人 | ✓ 仅本人 |
| 文件上传 | ✓ | ✓ |
| 后台首页 | ✓ | - |
| 管理员管理(增删改查、批删) | ✓ | - |
| 普通用户管理(增删改查、批删) | ✓ | - |
| 重置他人密码 | ✓ | - |
| 宠物分类管理 | ✓ | - |
| 前台首页 | - | ✓ |
| 个人中心 | - | ✓ |
说明:后台与前台的角色隔离由前端布局实现——
AdminLayout.vue检测到currentUser.type === 'USER'时跳回/,FrontLayout.vue检测到type !== 'USER'时跳转/admin;后端/admin/*系列接口当前仅要求登录(Token 校验),未做额外的角色判断,仅「重置密码」接口在后端校验了ADMIN角色。
# 默认账号
# 管理员
用户名: admin
密码: 123456
2
来源:sql/sql.sql 中 admin 表初始化数据(nickname 为「系统管理员」,contact 为 13800000000)。
# 测试账号(普通用户)
用户名: user
密码: 123456
2
来源:sql/sql.sql 中 user 表初始化数据(nickname 为「管理员」,contact 为 13800000000)。
# 核心业务流程
# 用户注册流程
1. 打开 /register 注册页,填写头像、用户类型、用户名、密码、昵称(前端校验必填项)。
2. 前端提交 PUT /common/register。
3. 后端按 username 查询 user 表,若已存在则返回「用户名重复」。
4. 后端移除前端传入的 type 字段(角色不落库),使用 UserSerializer 校验并写入 user 表。
5. 返回用户信息,前端提示「注册成功,正在跳转」并跳转 /login。
2
3
4
5
# 登录与 Token 认证流程
1. 在 /login 选择用户类型(ADMIN / USER),输入账号密码,提交 POST /common/login。
2. 后端校验 type 是否为 ADMIN / USER,无效则返回「无效的用户类型」。
3. 按 type 查询 admin 表或 user 表,用户不存在或密码不一致时统一返回「用户名或者是密码错误」。
4. 校验通过后生成 JWT(HS256,密钥为 Django SECRET_KEY,有效期 30 天),载荷为 {id, username, type}。
5. 返回用户信息 + token + type,前端写入 localStorage(token、currentUser),按角色跳转 / 或 /admin。
6. 后续请求由 axios 请求拦截器自动在请求头写入 token;TokenInterceptorMiddleware 校验非白名单接口,
校验通过则把 id / username / type 注入 request,校验失败返回 code 401,前端清除 token 并跳转登录页。
2
3
4
5
6
7
# 账号管理与重置密码流程
1. 管理员在 /admin/admin 或 /admin/user 页面点击「新增」,填写头像、用户名、昵称、电话、邮箱并提交。
2. 新增接口(POST /admin/add 或 POST /user/save)中若未传密码,后端默认写入 123456。
3. 管理员点击列表中的「重置密码」,前端请求 POST /common/resetPassword?type=ADMIN&id=xx。
4. 后端校验当前登录用户 type 必须为 ADMIN,否则返回「无权执行此操作」。
5. 校验通过后把目标账号密码更新为 123456,返回「密码重置成功,新密码为:123456」。
2
3
4
5
# 代码生成器生成业务模块流程
1. 在目标数据库中按规范建表(主键 id 为 bigint 自增且注释「ID」,状态类字段用中文描述,关联字段用 xx_id 逻辑关联)。
2. 修改 CodeGenerator/src/main/java/com/project/platform/utils/generator/DjangoProjectPathConfig.java 的 PROJECT_ROOT,
指向本项目的 project 目录(当前文件中的路径为模板示例路径,需按实际项目修改)。
3. 在 CodeGeneratorMain.java 中配置数据库连接(地址、端口、用户名、密码、库名)与待生成的表列表
(参数格式:表名、中文显示名称、Django app 名称),运行 main 方法。
4. 生成 Django 侧 models.py、序列化器、views.py、urls.py 与 Vue3 侧管理页面,并自动注册 INSTALLED_APPS、路由与后台菜单。
5. 启动后端与前端验证生成结果(python manage.py runserver / npm run dev)。
2
3
4
5
6
7
# 技术说明
# 系统架构
- 前端:Vue 3.4.29 + Element Plus 2.8.4 + Vite 5.3.1
- 后端:Django 3.2(由 3.2.20 生成)+ Django REST Framework 3.14.0
- 数据库:MySQL(当前配置库名
django_template,字符集 utf8mb4) - 认证:自定义 JWT Token(HS256,请求头字段
token)
# 访问地址
- 后端API:http://127.0.0.1:8000(
frontend/.env.development的VITE_APP_API_URL与settings.py的HTTP_PICTURE均指向该地址,Django 开发服务器默认端口为 8000) - 前端页面:http://localhost:5173(开发环境,Vite 默认端口;
vite.config.js中未显式配置server.port) - 接口文档:http://127.0.0.1:8000/swagger/(drf-yasg)
# 数据库
- 数据库名:django_template(沿用模板默认值,尚未按本项目重命名)
- 字符集:utf8mb4(
sql/sql.sql中表的排序规则为utf8mb4_unicode_ci) - 总表数:
sql/sql.sql建表脚本包含 2 张表(admin、user);Django 模型层共定义 3 张表(admin、user、pet)
| 表名 | 模型类 | 所在 App | 说明 |
|---|---|---|---|
| admin | Admin | apps/admin | 管理员表(username、password、nickname、email、contact、avatar) |
| user | User | apps/user | 用户表(username、password、nickname、email、contact、avatar) |
| pet | Pet | apps/pet | 宠物信息示例表(name、category_id、age、gender、breed、color、health_status、image、description、source_type、user_id、create_time) |
说明:
apps/common/models.py中还保留了Test、A、B、C四个教学示例模型类(未指定db_table,且apps.common未注册到INSTALLED_APPS),不属于业务表;pet表在sql/sql.sql中暂无对应建表语句。
# API接口规范
RESTful风格:
GET /module/page # 分页查询(pageNum 页码,默认每页 10 条)
GET /module/list # 查询全部(不分页)
POST /module/add # 新增
PUT /module/update # 更新(局部更新)
DELETE /module/delete # 批量删除(请求体为 ID 数组)
响应格式:
{
"code": 200,
"msg": "操作成功",
"data": {...}
}
2
3
4
5
6
7
8
9
10
11
12
13
实际接口前缀:/common/*(登录注册等)、/admin/*(管理员管理)、/user/*(用户管理)、/pet/*(示例模块)、/file/upload(文件上传)。分页接口统一返回 {"total": 总数, "list": 列表};失败时 code 为 500 并携带 msg;未登录时 code 为 401。
# 系统特色
# 文件上传
- 接口:
POST /file/upload(apps/common/views.py的FileUploadAPIView,参数名为file)。 - 文件命名:使用
uuid4生成唯一文件名并保留原扩展名,避免同名覆盖。 - 存储位置:
settings.UPLOAD_PATH = "uploads\\"(相对项目根目录,目录不存在时自动创建);媒体访问配置为MEDIA_URL = "/uploads/"、MEDIA_ROOT = BASE_DIR/uploads。 - 访问地址:
settings.HTTP_PICTURE = "http://127.0.0.1:8000/uploads/",接口返回{"name": 原文件名, "url": 访问地址}。 - 限制说明:后端接口与
settings.py中未配置文件大小或文件类型限制;前端MyUpload.vue依据type设置accept(image/*、video/*、audio/*),默认最多 100 个文件,富文本组件中视频上传限制为100 * 1024 * 1024。 - 上传方式:所有上传请求都会自动携带登录 Token(
MyUpload.vue与MyEditor.vue均设置请求头token)。
# 统一响应格式
apps/common/ResponseMessage.py 统一封装返回结构:success(data) 返回 code 200 / msg「操作成功」;failed() 返回 code 500 / msg「操作失败」;other(data) 返回 code 500 且把提示信息同时放入 data 与 msg;jump(code, data) 用于返回 401 等需要前端跳转的状态。
# 全局异常处理
utils/exception_handler.py 提供 custom_exception_handler,按「自定义异常 → Django 内置异常(ObjectDoesNotExist、Http404、PermissionDenied)→ DRF 异常 → 未知异常」的顺序统一处理,输出 code / msg / data 结构并写入日志(需在 settings.py 的 REST_FRAMEWORK 中配置 EXCEPTION_HANDLER 后生效,当前配置尚未启用该项)。
# 工具函数库
utils/jwt_auth.py:create_token生成 Token、get_payload解析并区分「认证失败 / 已失效 / 非法 Token」三种错误,另提供JwtQueryParamAuthentication、JwtHeaderAuthentication两个 DRF 认证类。utils/DateUtil.py:get_last_seven_days()取最近 7 天日期、get_date()返回格式化为%Y-%m-%d的日期列表。utils/current_user.py+middleware/CurrentUserMiddleware.py:基于 ThreadLocal 保存当前登录用户,便于在任意位置通过get_current_user()等方法获取用户信息(中间件当前未登记到MIDDLEWARE)。apps/common/signals.py:pre_save_timestamp_handler在保存时自动写入create_time(为空时)与update_time,已挂载到Admin、User、Pet模型。- 前端
utils/tools.js:封装isLogin()、getCurrentUser()、getToken()、formatDateToYYYYMMDD();utils/http.js统一 axios 实例(超时 5000ms、请求头自动携带 token、按code200/401/409/500 统一处理并弹出全局消息)。
# 前端通用组件
components/MyUpload.vue:五种类型的通用文件上传组件,被登录注册页头像、个人信息与后台新增/编辑表单复用。components/MyEditor.vue:基于 wangEditor(@wangeditor/editor^5.1.14、@wangeditor/editor-for-vue^5.1.12)封装的可复用富文本编辑器组件,支持工具栏、图片与视频上传(上传地址与 Token 已配置);该组件当前已在admin/Admin.vue、admin/User.vue中引入,但尚未在页面模板中实际渲染使用。
# 代码生成器
CodeGenerator 为独立的 Java 工具工程(Spring Boot 2.5.6 + MyBatis-Plus Generator 3.5.2 + Velocity 2.3 + mysql-connector-j 8.1.0),支持按表批量生成 Django 后端 CRUD 与 Vue3 管理页面,并自动注册 App、路由与后台菜单;模板文件位于 src/main/resources/templates/page.vue.vm。
# 项目当前状态说明
重要提示:本项目目前为基础框架版本,医院管理相关的业务模块(如科室、医生、挂号预约、就诊记录等)尚未在代码中实现。 框架已具备:账号体系、管理员与用户管理、示例模块(宠物类型、宠物信息)、JWT 认证、文件上传、代码生成器。 后续可基于
CodeGenerator依据医院业务数据表批量生成对应模块的 Django + Vue3 代码。
补充说明(均为当前代码的真实状态,便于后续开发对接):
- 菜单与页面:后台菜单只有「首页 / 管理员管理 / 用户管理 / 宠物分类管理」四项,前台只有「首页 / 个人中心」两项;后台首页(
admin/Home.vue)与前台首页(front/Index.vue)目前仅显示「首页」文字,未接入统计图表(echarts已在package.json中声明但源码中尚无任何引用)。 - 路由现状:
frontend/src/router/index.js中将/admin/pet指向views/admin/PetCategory.vue;views/admin/Pet.vue已存在但未在路由中注册。 - 分类模块现状:
apps/pet/PetCategorySerializer.py引用的PetCategory模型在apps/pet/models.py中不存在;「宠物分类管理」页面实际调用的是/pet/page接口。 - 管理员接口现状:
apps/admin/views.py中的增删改查统一操作User模型(即/admin/*与/user/*系列接口读写同一张user表)。 test模块现状:settings.py与project/urls.py中仍注册了apps.test与/test/路由,但该 App 目录下已无源码文件。- 注册与改密的实现细节:
apps/user/views.py的RegisterAPIView会向前端数据中写入role_type字段(该字段在User模型中不存在),前台注册实际走的是PUT /common/register;EditPassword.vue提交的id为空字符串,而后端/common/updatePassword要求id等于当前登录用户 ID,前端页面后续需补充从本地登录信息中回填id。 - 数据库与配置:
settings.py中数据库名仍为django_template,数据库连接指向118.89.93.2:3306;sql/sql.sql只包含admin、user两张表的建表与初始化数据,pet表的建表语句尚未纳入该脚本。